之前明明学会了的结果隔了一段时间就忘得七七八八了噫呜呜噫
写篇blog记录一下方便以后回顾!
代码:
class Solution
{
public:
string longestPalindrome(string s)
{
if(s=="") return "";
string ans="";
string ss="";
ss+='$';ss+='#';
for(int i=0;i<s.length();i++)
{
ss+=s[i];
ss+='#';
}
ss+='%';
int len=ss.length();
int p[len+5];
p[0]=0;
int mx=0,id=0;int sta=0,max_len=1;
/*
p[i]表示以i为中点的最长回文串的半径长(包括中点)
example:
$#a#b#a#c#%
01214121211
id表示前面最长回文子串中心位置,mx表示其右边界
*/
for(int i=1;i<len;i++)
{
if(mx>i) p[i]=min(p[2*id-i],mx-i);
else p[i]=1;
/*
%** id **% mx
i
*/
while(ss[i-p[i]]==ss[i+p[i]]) p[i]++;
if(i+p[i]>mx)
{
mx=i+p[i];
id=i;
if(p[i]-1>max_len)
{
max_len=p[i]-1;
sta=(i-p[i])/2;
}
}
}
int step=0;
for(int i=sta;i<len;i++)
{
step++;
if(step>max_len) break;
ans+=s[i];
}
return ans;
}
};