博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~
http://www.cnblogs.com/chenxiwenruo/p/6789177.html
特别不喜欢那些随便转载别人的原创文章又不给出链接的
所以不准偷偷复制博主的博客噢~~
给出一个字符串,让你找出其中最长的回文子串的长度
因为长度最多1000,其实暴力枚举也可以
对于第i个字符,往前、往右找,统计能够达到的最大回文长度,for一遍即可
然而如果对应大数据就不行了,所以这里还是用了
Manacher算法 O(n) 求最长回文子串
不会的还是建议戳一下链接学习一下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> #include <cmath> using namespace std; const int M = 1005*2; char str[M];//start from index 1 int p[M]; char s[M]; int n; void checkmax(int &ans,int b){ if(b>ans) ans=b; } inline int min(int a,int b){ return a<b?a:b; } void pk(){ int i; int mx = 0; int id; for(i=1; i<n; i++){ if( mx > i ) p[i] = min( p[2*id-i], p[id]+id-i ); else p[i] = 1; for(; str[i+p[i]] == str[i-p[i]]; p[i]++) ; if( p[i] + i > mx ) { mx = p[i] + i; id = i; } } } void pre() { int i,j,k; n = strlen(s); str[0] = '$'; str[1] = '#'; for(i=0;i<n;i++) { str[i*2 + 2] = s[i]; str[i*2 + 3] = '#'; } n = n*2 + 2; str[n] = 0; } void pt() { int i; int ans = 0; for(i=0;i<n;i++) ans=max(ans,p[i]); printf("%d ", ans-1); } int main() { gets(s); //printf("%s ",s); pre(); pk(); pt(); return 0; }