leetcode 5 最长回文子串(马拉车算法)
添加‘#’的原因是让偶数回文串也可以有中心点,添加‘!’和’?’的原因是防止len数组越界
其中len[i]表示以i为中心时,从i到以i为中心的回文串的最右边的长度
mx表示循环到此时之前所有的回文串的右边界的最大值,p表示该回文串的中心
class Solution { public: string longestPalindrome(string s) { int length=s.size(); string ss="!#"; for(int i=0;i<length;i++) { ss+=s[i]; ss+='#'; } ss+='?'; int *len=new int[2*length+3]; int start=1,maxn=0; int mx=1,p=1; for(int i=1;i<ss.size()-1;i++) { len[i]=i>=mx?1:min(mx-i,len[2*p-i]); while(ss[i+len[i]]==ss[i-len[i]])len[i]++; if(mx<len[i]+i) { mx=len[i]+i; p=i; } if(maxn<len[i]) { maxn=len[i]; start=i; } } string res=""; for(int i=start-maxn+1;i<start+maxn;i++) { if(ss[i]!='#') res+=ss[i]; } return res; } };
posted on 2020-03-09 18:30 QingFengDaHui 阅读(187) 评论(0) 编辑 收藏 举报