【暴力枚举】

求最长回文串最容易的方法就是暴力枚举,求出字符串的每一个子串,然后判断是不是回文,找到最长的那个回文串

求每一个子串的时间复杂度为 O(N^2),判断一个子串是不是回文时间复杂度为 O(N),总的时间复杂度为 O(N^3)

string str;
void longestPalindrome(){int len=str.size();//字符串长度int maxlen=1;//最长回文串长度int start=0;//最长回文串起始地址for(int i=0;i<len;i++){//起始地址for(int j=i+1;j<len;j++){//结束地址//判断是不是回文int temp1=i,temp2=j;while(temp1<temp2 && str.at(temp1)==str.at(temp2)){temp1++;temp2--;}if(temp1>=temp2&&j-i+1>maxlen){start=i;//更新回文串起始地址maxlen=j-i+1;//更新回文串长度}}}str=str.substr(start, maxlen);
}
int main(){cin>>str;longestPalindrome();cout<<str<<endl;;return 0;
}

【中心扩展法】

中心扩展就是将给定的字符串的每一个字母当做中心,然后向两边扩展,这样来寻找最长的回文串。其需要考虑两种情况:长度为奇数的回文串、长度为偶数的回文串。

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

string str;
void longestPalindrome(){int len=str.size();//字符串长度int maxlen=1;//最长回文串长度int start=0;//最长回文串起始位置//长度为奇数的回文串for(int i=0;i<len;i++){//枚举中心位置int left=i-1,right=i+1;//以i为中心向左右两边扩展while(left>=0 && right<len && str.at(left)==str.at(right)){if(right-left+1>maxlen){start=left;//更新回文串起始位置maxlen=right-left+1;//更新回文串长度}left--;right++;}}//长度为偶数的回文串for(int i=0;i<len;i++){//枚举中心位置int left=i,right=i+1;//以i为中心向左右两边扩展while(left>=0 && right<len && str.at(left)==str.at(right)){if(right-left+1>maxlen){start=left;//更新回文串起始位置maxlen=right-left+1;//更新回文串长度}left--;right++;}}str=str.substr(start, maxlen);
}
int main(){cin>>str;longestPalindrome();cout <<str<<endl;return 0;
}

【动态规划】

设 dp[j][i] 表示从 j 到 i 的子串是否是回文串,则:

当 dp[j][i]=true 时,表示从 j 到 i 的子串为回文子串,且子串起点位置为 j,长度为 i - j + 1

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

string str;
bool dp[N][N];
void longestPalindrome(){memset(dp,false,sizeof(dp));int len=str.size();//字符串长度int start=0;//最长回文子串起点int maxlen=1;//最长回文子串长度for(int i=0;i<len;i++){//字符串终点for(int j=0;j<=i;j++){//字符串起点if(i-j<2)dp[j][i]=(str[i]==str[j]);elsedp[j][i]=(str[i]==str[j] && dp[j+1][i-1]);if(dp[j][i] && maxlen<i-j+1){start=j;//更新回文串起点maxlen=i-j+1;//更新回文串长度}}}str=str.substr(start, maxlen);
}int main(){cin>>str;longestPalindrome();cout<<str<<endl;return 0;
}

【Manacher 算法】

时间复杂度:O(N)

算法详解:点击这里

字符串处理 —— 回文串相关 —— 求最长回文子串相关推荐

  1. python求回文_python实现求最长回文子串长度

    给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最长回文子串是'3553',所以返回4. 最容易想到的办法是枚举出所有的子串,然后一一判断是否为回文串,返回最长的回文子 ...

  2. 文巾解题 5. 最长回文子串

    1 题目描述 2 解题思路 2.1 动态规划 对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串. 例如对于字符串 "ababa" ...

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

    [概述] Manacher 算法又称马拉车算法,用于求最长回文子串. 对于最长回文子串传统的求法的求法是以每个字符为中心,向两边寻找回文子串,在遍历完整个数组后即可得到最长回文子串,其时间复杂度为 O ...

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

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

  5. 求最长回文串-从动态规划到马拉车之路(下)

    预备知识: (1)在一个数轴上有两点i和j(i<=j)关于点m对称,那么有 i = 2m-j: 证明: 因为 i<=j 且 i 和 j 关于 m 对称,那么有 (i + j)/ 2 = m ...

  6. Manacher算法 - 求最长回文串的利器

    求最长回文串的利器 - Manacher算法 Manacher主要是用来求某个字符串的最长回文子串. 不要被manacher这个名字吓倒了,其实manacher算法很简单,也很容易理解,程序短,时间复 ...

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

    [问题] 给定一个字符串,问对该字符串,是否能通过添加一个字符后变为回文串. 若可以,输出 YES,否则输出 NO 对于该问题,首先要明白,删除一个字符与添加一个字符在判断回文串中是等价的. [暴力枚 ...

  8. 最长回文 HDU - 3068(求最长回文串的长度【马拉车算法Manacher】)

    马拉车算法 Manacher's Algorithm 是用来查找一个字符串的最长回文子串的线性方法,由一个叫 Manacher 的人在 1975 年发明的,这个方法的最大贡献是在于将时间复杂度提升到了 ...

  9. 求最长回文串-从动态规划到马拉车之路(上)

    要解决的问题: 给定一个字符串,要求求出这个字符串中的最长的回文串子串. 例子: cbddba的最长回文子串为 bddb cbdedba的最长回文子串为dbedb 由上面的例子可以看到,在考虑回文子串 ...

最新文章

  1. docker停止、删除容器、删除镜像 一看就理解
  2. 湖北孝感计算机职称考试,2015湖北职称计算机考试报名:孝感职称计算机报名入口...
  3. bilibili怎么设置弹幕数量_python爬取B站视频弹幕分析并制作词云
  4. [leetcode] 22. Generate Parentheses
  5. winrar压缩工具
  6. UI5 registerModulePath
  7. 明天放假,我放价!一个国庆假期教你学会数学建模
  8. 3.SFB标准版前端安装
  9. Java类类getResourceAsStream()方法及示例
  10. 软件项目验收汇报ppt_项目验收!万能PPT模板!等你来拿
  11. Linux系统下Postgresql数据库安装
  12. 光学定位与追踪技术_视觉SLAM技术学习笔记(一)基础知识以及SLAM的应用
  13. 七个不放过和四项原则
  14. 360面临两线作战----手机安全领域硝烟再起
  15. tp摄像头的默认地址_tplink的ip默认地址是什么?
  16. MapReduce 编程实例:词频统计
  17. Python华氏度和摄氏度之间的转换
  18. 外盘期货分仓软件(如智星系统,信管家)等功能
  19. 前端JavaScript自学复盘梳理D2
  20. 微型计算机核心是主板和内存,低配也能轻松“吃鸡”!《绝地求生:大逃杀》CPU及内存需求测试...

热门文章

  1. 终于有人把赌徒谬误讲明白了
  2. Makefile之自动生成依赖(8)
  3. c++十进制转二进制_二进制与十进制相互转换的原理
  4. Git 各指令的本质,真是通俗易懂啊
  5. 再见了Spring!这个架构有点厉害,甚至干掉了Dubbo!
  6. Nginx的这些妙用,你肯定有不知道的!
  7. 【开发工具】 JEECG_3.7新版开发工具
  8. UI标签库专题六:JEECG智能开发平台 Autocomplete(自动补全标签 )
  9. 神经网络优化算法总结【SGD】---【Adam】
  10. Linux IPC实践(10) --Posix共享内存