马拉车
首先我们来看这两个串:abba和abcba。第一个串的回文中心在两个b之间,第二个串的回文中心为字符c,这样两种情况我们分类讨论太麻烦了,所以我们考虑对原字符串进行一个字符填充,abba->@#a#b#b#a# ,abcba->@#a#b#c#b#a#,这样他们都变成了奇数,讨论的情况就一致了。
int getstr() {//重定义字符串,s为原字符串,str为新串,len为s串长度,返回新串长度 初始化扩充 int k=0,len=strlen(s); str[k++]='@'; for(int i=0;i<len;i++){ str[k++]='#'; str[k++]=s[i]; } str[k++]='#'; return k; }
int manacher(int len){//len为str串长度也就是填充过后的长度 int mx=0,id;//mx为以id为中心的最长回文子串的右界 id为中心 int maxx=0; for(int i=0;i<len;i++)
{ if(i<mx)
num[i]=min(mx-i,num[2*id-i]);//i在mx左边,取在边界以内且较小的那段,num[i]为以i为对称中心能得到的最长回文半径 else
num[i]=1;//i在mx右边,所以直接等于1 while(str[i+num[i]]==str[i-num[i]])
num[i]++;//向右一个个匹配 超出右界 if(i+num[i]>mx)
{ mx=i+num[i]; id=i; maxx=max(maxx,num[i]-1); } } return maxx; }

浙公网安备 33010602011771号