一个算法,Manacher 算法,中文里是“马拉车算法”专门针对回文字符串的算法,好处是时间复杂度是o(n)而且处理后只需要处理奇数的回文串的情况,具体的百度吧,我把模板贴出来,感兴趣的访问下面网站,讲的蛮好的
https://ethsonliu.com/2018/04/manacher.html
然后我自己写了一个,容易理解的,相当于没有算法了,但是,我觉得 ,当然仅仅我觉得,复杂度还是o(n),当然有很多地方优缺点,具体情况具体用着吧,感觉这个还不错,先记住
#include <bits/stdc++.h>
using namespace std;
int main(){
string a,b;
getline(cin,a);
int p[10000];
b+="$#";
for(int i=0;i<a.length();i++){
b+=a[i];
b+='#';
}
int mx=0,id=0,maxn=0;
for(int i=1;i<b.length();i++){
p[i]=1;
while(b[i-p[i]]==b[i+p[i]])p[i]++;
maxn=max(maxn,p[i]-1);
}
cout<<maxn;
return 0;
}
如果用了拉马车算法的话应该是这样的,后者可能相对来说复杂度更小?谁知道呢,反正这样是可以的,不管了,先记住吧,以后慢慢会理解的吧
#include <bits/stdc++.h>
using namespace std;
int main(){
string a,b;
getline(cin,a);
int p[10000]={0};
b+="$#";
for(int i=0;i<a.length();i++){
b+=a[i];
b+='#';
}
int mx=0,id=0,maxn=0;
for(int i=1;i<b.length();i++){
if(mx>i)
p[i]=min(p[2*id-i],mx-i);
else
p[i]=1;
while(b[i-p[i]]==b[i+p[i]])p[i]++;
if(p[i]+i>mx){
mx=p[i]+i;
id=i;
}
maxn=max(maxn,p[i]-1);
}
cout<<maxn;
return 0;
}