算法解决的问题
求最长回文子串
预处理
int len=s.length();
string str="";
str+="@";
for(int i=0;i<len;i++){
str+="#";
str+=s[i];
}
str+="#";
len*=2;
len+=2;
求出num数组
int num[1000+10];
int mx,id;///mx为右边界,id为前一个回文的中心点,
mx=0,id=0;
int ans=0;//最长的串长度
int fl=0;
for(int i=0;i<len;i++){
if(i<mx) num[i]=min(mx-i,num[id*2-i]);
else num[i]=1;
while(str[i+num[i]]==str[i-num[i]]) num[i]++;
if(i+num[i]>mx){
mx=i+num[i];
id=i;
if(num[i]-1>ans){
ans=num[i]-1;
fl=i;
}
// ans=max(ans,num[i]-1);
}
}
最后的结果就是最长的num[i]-1,起始位置是中心点减半径再除以2
string tt="";
fl=(fl-num[fl])/2;
for(int i=fl;i<fl+ans;i++){
tt+=s[i];
}
cout << tt << endl;