给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串。
您在真实的面试中是否遇到过这个题? Yes
样例
给出字符串 "abcdzdcab"
,它的最长回文子串为 "cdzdc"
。
挑战
O(n2) 时间复杂度的算法是可以接受的,如果你能用 O(n) 的算法那自然更好。
标签
Expand
相关题目
Expand
分析:尝试写了遍manacher算法。其中p[i]表示以i为中心,包括i在内的半径
代码:
class Solution {
public:
/**
* @param s input string
* @return the longest palindromic substring
*/
string longestPalindrome(string& s) {
// Write your code
string news = "$#";
for(int i=0;i<s.length();i++)
{
news+=s[i];
news+="#";
}
vector<int> p(news.length(),0);
int mx = 0;
int id = 0;
int retid = 0;
int maxp = 0;
for(int i=0;i<news.length();i++)
{
if(mx>i)
{
p[i] = min(mx-i,p[2*id-i]);
}
else
p[i] = 1;
while(i-p[i]>=0&&news[i+p[i]]==news[i-p[i]])
p[i]++;
if(i+p[i]>mx)
{
mx = i+p[i];
id = i;
}
if(p[i]>maxp)
{
maxp = p[i];
retid = i;
}
}
string ret = "";
for(int i=retid-p[retid]+1;i<=retid+p[retid]-1;i++)
if(news[i]!='#')
ret+=news[i];
return ret;
}
};