字符串处理 —— 回文串相关 —— 求最长回文子串
【暴力枚举】
求最长回文串最容易的方法就是暴力枚举,求出字符串的每一个子串,然后判断是不是回文,找到最长的那个回文串
求每一个子串的时间复杂度为 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)
算法详解:点击这里
字符串处理 —— 回文串相关 —— 求最长回文子串相关推荐
- python求回文_python实现求最长回文子串长度
给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最长回文子串是'3553',所以返回4. 最容易想到的办法是枚举出所有的子串,然后一一判断是否为回文串,返回最长的回文子 ...
- 文巾解题 5. 最长回文子串
1 题目描述 2 解题思路 2.1 动态规划 对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串. 例如对于字符串 "ababa" ...
- 字符串处理 —— 回文串相关 —— Manacher 算法
[概述] Manacher 算法又称马拉车算法,用于求最长回文子串. 对于最长回文子串传统的求法的求法是以每个字符为中心,向两边寻找回文子串,在遍历完整个数组后即可得到最长回文子串,其时间复杂度为 O ...
- 字符串处理 —— 回文串相关
[回文串] 回文串,就是一个正读与反读都一样的字符串,比如:abcdcba.zxccxz 等 常见的回文串算法有:求字符串中最长回文串.判断一个字符串是否为回文串.在字符中添加/删除一个字符后是否为回 ...
- 求最长回文串-从动态规划到马拉车之路(下)
预备知识: (1)在一个数轴上有两点i和j(i<=j)关于点m对称,那么有 i = 2m-j: 证明: 因为 i<=j 且 i 和 j 关于 m 对称,那么有 (i + j)/ 2 = m ...
- Manacher算法 - 求最长回文串的利器
求最长回文串的利器 - Manacher算法 Manacher主要是用来求某个字符串的最长回文子串. 不要被manacher这个名字吓倒了,其实manacher算法很简单,也很容易理解,程序短,时间复 ...
- 字符串处理 —— 回文串相关 —— 添加/删除字符后是否为回文串
[问题] 给定一个字符串,问对该字符串,是否能通过添加一个字符后变为回文串. 若可以,输出 YES,否则输出 NO 对于该问题,首先要明白,删除一个字符与添加一个字符在判断回文串中是等价的. [暴力枚 ...
- 最长回文 HDU - 3068(求最长回文串的长度【马拉车算法Manacher】)
马拉车算法 Manacher's Algorithm 是用来查找一个字符串的最长回文子串的线性方法,由一个叫 Manacher 的人在 1975 年发明的,这个方法的最大贡献是在于将时间复杂度提升到了 ...
- 求最长回文串-从动态规划到马拉车之路(上)
要解决的问题: 给定一个字符串,要求求出这个字符串中的最长的回文串子串. 例子: cbddba的最长回文子串为 bddb cbdedba的最长回文子串为dbedb 由上面的例子可以看到,在考虑回文子串 ...
最新文章
- docker停止、删除容器、删除镜像 一看就理解
- 湖北孝感计算机职称考试,2015湖北职称计算机考试报名:孝感职称计算机报名入口...
- bilibili怎么设置弹幕数量_python爬取B站视频弹幕分析并制作词云
- [leetcode] 22. Generate Parentheses
- winrar压缩工具
- UI5 registerModulePath
- 明天放假,我放价!一个国庆假期教你学会数学建模
- 3.SFB标准版前端安装
- Java类类getResourceAsStream()方法及示例
- 软件项目验收汇报ppt_项目验收!万能PPT模板!等你来拿
- Linux系统下Postgresql数据库安装
- 光学定位与追踪技术_视觉SLAM技术学习笔记(一)基础知识以及SLAM的应用
- 七个不放过和四项原则
- 360面临两线作战----手机安全领域硝烟再起
- tp摄像头的默认地址_tplink的ip默认地址是什么?
- MapReduce 编程实例:词频统计
- Python华氏度和摄氏度之间的转换
- 外盘期货分仓软件(如智星系统,信管家)等功能
- 前端JavaScript自学复盘梳理D2
- 微型计算机核心是主板和内存,低配也能轻松“吃鸡”!《绝地求生:大逃杀》CPU及内存需求测试...