原理讲的清晰:Manacher's ALGORITHM: O(n)时间求字符串的最长回文子串
注意:
①动态生命P[]和newStr数组后,不要忘记delete[] //其实这是基本的编码习惯
②最终返回结果是P[i]-1
下面是自己写的Manacher函数
int manacher(char *src){ int srcLen=strlen(src); int len=2*srcLen+2; char *newStr=new char[len];//还是+3??要不要给\0留个位置??不用 int *P=new int[len]; int i,rst=0; //处理字符串 newStr[0]='$'; newStr[1]='#'; for(i=0;i<srcLen;i++){ newStr[2*i+2]=src[i]; newStr[2*i+3]='#'; } //关键步骤:求P[i] int id=0; int mx=0; P[0]=1; for(i=1;i<len;i++){ if(mx>i) P[i]= MIN(mx-i , P[2*id-i]); else P[i]=1; while(newStr[i+P[i]] == newStr[i-P[i]]) P[i]++;//据说这一步永远不会成立 //更新id和mx if(P[i]+i > mx){ id=i; mx=P[i]+i; } } //找到P[i]中最大值,注意最终返回的结果是P[i]-1 for(i=0;i<len;i++) if(rst<P[i]) rst=P[i]; delete[] P; delete[] newStr; return rst-1; }
参考代码:http://blog.csdn.net/ggggiqnypgjg/article/details/6645840 用定长的char数组
http://blog.csdn.net/bruce_zeng/article/details/8629572 new动态声明后没有delete