题目:最长回文子字符串
给定一个字符串s,找到s中最长的回文子字符串。 您可以假设s的最大长度为1000。
示例:
Input: "babad" Output: "bab" Note: "aba" is also a valid answer.
思路:
第一种解决办法:通过遍历字符串中每一个字符,对该字符前后进行回文的判断,并保存当前最长回文字符串,遍历完成后得到输出结果。
代码待实现。。。。
第二种解决办法:使用Manacher算法求解
Manacher算法的思路详见Manacher算法介绍
C++代码实现如下:
class Solution {
public:
string longestPalindrome(string s) {
int mx = 0;
string ns = "";
ns += '$';
ns += '#';
for(int i = 0;i<s.size();i++)
{
ns += s[i];
ns += '#';
}
ns += '\0';
vector<int> p(ns.size());
int id = 1;
int maxlen = -1;
int k = 0;
int r;
for(int i = 1;i<ns.size();i++)
{
if(i < mx)
{
p[i] = min(p[2*id-i],mx - i);
}
else
p[i] = 1;
while (ns[i - p[i]] == ns[i + p[i]])
p[i]++;
if(mx < i + p[i])
{
mx = i+p[i];
id = i;
}
if(maxlen < p[i] -1)
{
maxlen = p[i]-1;
k = i;
}
}
cout<<id<<" "<<mx<<endl;
cout<<maxlen<<" "<<k<<endl;
string res = "";
for(int i = k-maxlen+1;i<=k+maxlen;i++)
{
if(ns[i] >= 'a' && ns[i] <= 'z')
res += ns[i];
}
return res;
}
};