【ATT】Longest Palindromic Substring
O(n)的解法。详情见:http://www.felix021.com/blog/read.php?2040
string longestPalindrome(string s) {
// Note: The Solution object is instantiated only once and is reused by each test case.
if(s.empty())
return "";
int mx,i,id;
//construct p.Transform S into T.For example, S = "abba", T = "^#a#b#b#a#$".
string str(2*s.size()+3,'$');
vector<int> p(2*s.size()+2);
str[0] = '^';
str[1] = '#';
int cnt = 2;
for(i=0;i<s.size();i++)
{
str[cnt++] = s[i];
str[cnt++] = '#';
}
mx = 0;
for(i=1;i<cnt;i++)
{
if(mx<=i)
p[i] = 1;
else
p[i] = min(mx-i,p[2*id-i]);
while(str[i-p[i]]==str[i+p[i]])
p[i]++;
if(i+p[i]>mx)
{
mx = i+p[i];
id = i;
}
}
int max_len = 0;
int cur_idx = 0;
for(i=1;i<cnt;i++)
{
if(p[i]-1>max_len)
{
max_len = p[i] -1;
cur_idx = i;
}
}
return s.substr((cur_idx - 1 - max_len)/2, max_len);
}
浙公网安备 33010602011771号