最近遇到几道回文字符串的题目都不太记得,来记录一下。
首先我们需要预处理字符串
例如abba,我们需要处理为:@#a#b#b#a#
int init(string& s)
{
str="@#";
for(int i=0;i<s.size();++i)
{
str+=s[i];
str+='#';
}
return str.size();//返回处理后的字符串长度
}
接着开始正式过程
我们定义p[i]代表:处理过后字符串str[i]为中心的最长回文半径,例如@#a#b#b#a#中 p[2]=2,即以’a’为中心的最长回文半径为2.
定义mx代表当前处理到的最大处
id为目前最长处理处所指代的中心
int mx=0,id=0;
int maxz=0;
for(int i=1;i<n;i++)
{
if(i<mx) p[i]=min(p[id*2-i],mx-i);
else p[i]=1;
while(str[p[i]+i]==str[i-p[i]]) ++p[i];
if(i+p[i]>mx) mx=p[i]+i,id=i;
maxz=max(maxz,p[i]-1);
}
即maxz为最长回文长度
大家可以取参考B站up主:wa自动机