【问题】

给定一个字符串,问对该字符串,是否能通过添加一个字符后变为回文串。

若可以,输出 YES,否则输出 NO

对于该问题,首先要明白,删除一个字符与添加一个字符在判断回文串中是等价的。

【暴力枚举】

先判断字符串是否回文,若是回文,可以在中间添加/删除一个字符(对于奇数串,添加/删除中间的那个字符;对于偶数串,可在中间添加任意一个字符,可删除中间两个任意一个字符),直接返回 YES,若字符串不是回文,依次去掉一个字符后判断剩下的字符串是否为回文串

例如:对于字符串 abcddecba,首先去掉 a,判断 bcddecba,然后去掉 b,判断 acddecba,再去掉 c,判断 abddecba,以此类推的进行下去,若发现回文即可停止返回 YES,反之如果一直没发现回文串,返回 NO

时间复杂度:O(n^2)

bool isPalindrome(string str){//判断字符串是否为回文string temp=str;reverse(temp.begin(),temp.end());//反转字符串return str==temp;//比较与原字符串是否相同
}
int main(){string str;cin>>str;int len=str.size();//字符串长度bool flag=false;for(int i=0;i<str.size();i++){//从第一个字符开始枚举if(isPalindrome(str.substr(0,i)+str.substr(i+1,str.size()-1-i))){flag=true;break;}}if(flag)cout<<"YES"<<endl;elsecout<<"NO"<<endl;return 0;
}

【翻转解法】

该方法可以解决一类问题:对原字符串添加/删除几个字符可以构成回文串

先将原字符串逆序,然后计算两字符串的最长公共子序列长度,设 diff 为若可形成回文串,原字符串要添加/删除的个数,故有:diff=字符串长度-最长公共子序列长度

对于该问题,只要判断 diff<=1 即可

时间复杂度:O(N^2)

int LCS(string str,string rstr) {if(str.size()==0 || rstr.size()==0)//字符串长度为0return 0;vector< vector<int> > dp(str.size()+1,vector<int>(rstr.size()+1,0));for(size_t i=1; i<= str.size(); ++i){//原字符串的长度for(size_t j=1; j<= rstr.size(); ++j){//反转字符串的长度if(str[i-1] == rstr[j-1])//前面填充了一行一列,因此判断i-1和j-1dp[i][j]=dp[i-1][j-1]+1;elsedp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}return dp[str.size()][rstr.size()];
}int main(){//原字符串string str;cin>>str;//反转字符串string rstr=str;reverse(rstr.begin(),rstr.end());int diff=str.size()-LCS(str,rstr);if(diff<=1)cout<<"YES"<<endl;elsecout<<"NO"<<endl;return 0;
}

【掐头去尾】

首先找到字符串不匹配的位置,然后提取出中间不匹配的字符串,分别判断其去掉头和去掉尾后的两个字符串是否为回文,若其中一个为回文,返回 YES 即可。

例如:abcddecba,取出 dde,分别判断 dd 和 de,发现其中有一个满足回文,即返回 YES,否则返回 NO

时间复杂度:O(n^2)

bool isPalindrome(string str){//判断是否为回文for(int i=0;i<str.size()/2;i++)if(str[i]!=str[str.size()-1-i])return false;return true;
}int main(){string str;cin>>str;int pos=str.size()/2;for(int i=0;i<str.size()/2;i++){if(str[i]!=str[str.size()-1-i]){pos=i;//记录不匹配的位置break;}}bool flag=false;if(pos==str.size()/2)//不匹配位置在中间flag=true;else{bool str1=isPalindrome(str.substr(pos+1,str.size()-2*pos-1));//掐头bool str2=isPalindrome(str.substr(pos,str.size()-2*pos-1));//去尾flag=(str1||str2);//一个为true即为true}if(flag)cout<<"Yes"<<endl;elsecout<<"No"<<endl;return 0;
}

字符串处理 —— 回文串相关 —— 添加/删除字符后是否为回文串相关推荐

  1. c++语言将字符串逆序输出,C++实现字符串删除字符后逆序输出

    本文实例为大家分享了C++实现字符串删除字符后逆序输出的具体代码,供大家参考,具体内容如下 输入若干个字符串,和一个英文字符ch. 要求删除每个字符串中的字符ch(区分大小写),得到新的字符串,然后将 ...

  2. LeetCode680删除一个字符后是否还是回文字符串

    题目: 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串.示例 1:输入: "aba" 输出: True 示例 2:输入: "abca" 输出 ...

  3. 字符串处理 —— 回文串相关

    [回文串] 回文串,就是一个正读与反读都一样的字符串,比如:abcdcba.zxccxz 等 常见的回文串算法有:求字符串中最长回文串.判断一个字符串是否为回文串.在字符中添加/删除一个字符后是否为回 ...

  4. python输出回文字符串_程序,用于计算我们可以在Python中使用字符串字符进行的独特回文数...

    假设我们有一个字符串s,我们必须找到可以使用所有字符生成的不同回文数.如果答案很大,则将结果修改为10 ^ 9 + 7. 因此,如果输入类似于s =" xyzzy",则输出将为2, ...

  5. Word开发工具Aspose.Words功能演示:在C ++中以编程方式在Word文档中添加或删除页眉和页脚

    Word文档中的页眉和页脚用于格式化和显示重要信息,例如主题,章节,页码,Copywrite等.以编程方式使用Word文档时,可能需要添加或删除页眉和页脚.为此,本文将教您如何使用C ++在Word文 ...

  6. html增加删除线,HTML如何添加删除线?

    HTML中可以使用<del>标签和<strike>标签来给文本文字添加删除线.<del> 标签用于定义文档中已被删除的文本:<strike> 标签用于定 ...

  7. Elasticsearch(033):es中Document(文档)之删除文档

    一.概述 在上一小节中,我们学习了文档的定义和新增语法.当然,有新增操作,相反的就会有删除操作.es中的文档的删除操作分为两类: 主键删除 和查询删除. 二.删除文档(主键删除) 示例: 下面操作的含 ...

  8. 怎样在PDF文档中添加插入图片

    制作编辑文档的时候经常需要在文档中添加一些图片内容,这样可以使文档更生动.像word.ppt这些文档可以直接通过复制粘贴就可以了,那么编辑pdf文件的时候怎样在文件中插入图片呢? 方法/步骤 首先是需 ...

  9. 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?

    给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串.如何删除才能使得回文串最长呢? 输出需要删除的字符个数. 输入描述: 输入数据有多组,每组包含一个字符串s,且保证:1<=s. ...

最新文章

  1. 使用arthas采集火焰图
  2. C语言里面%2d 意思
  3. css设置标题边框,css 如何让文字标题显示在边框上?
  4. 谈谈NullableT的类型转换问题
  5. python schedule多线程_Python定时任务sched模块用法示例
  6. 使用Redis的简单消息队列
  7. 截取台风后的图片_今年首个台风来袭!“大黄蜂”下,货代如何“防台”?
  8. PyCharm汉化后无法打开Settings设置
  9. python的知识点运用_Python基础知识点
  10. 如何设置计算机屏幕不正,显示器颜色不正常如何调_电脑显示屏的颜色不对如何处理...
  11. CSS基础--属性设置
  12. 洛谷·[HNOI2015]落忆枫音
  13. knx ets5安装
  14. 2018年深圳,武汉房价走势分析
  15. 【入门】倒序输出一个四位整数
  16. Kali学习笔记32:Maltego、Exiftool
  17. 基于Android开发的仿网易云播放器
  18. 《2023年金融科技趋势展望》发布,提出十大技术趋势
  19. Cocos2d的ChipMunk
  20. 20P60 PR模板预设10 VHS专业预设包制作旧镜头复古磁带效果含背景音乐

热门文章

  1. 从0到1详解数据挖掘过程
  2. Simulink之理想开关
  3. 使用libjpeg进行JPEG图像解码
  4. pythonmail添加附件_Python 发送邮件可以添加附件
  5. Dubbo为什么用Go重写?
  6. 一个 bug ,罚款 200,我真待过这样的公司
  7. 10 岁研究计算机,电脑神童“不务正业”的技术路
  8. 2019年容器突然火了,到底什么是容器?!
  9. Java程序员必备:异常的十个关键知识点
  10. 揭秘阿里中台!一文看懂阿里推荐业务的两大利器 | 赠书