题意
求一个字符串的最长回文子串
思路
解法一:
暴力求解,枚举两个端点,检查范围内的字符串是否为回文串,时间复杂度
O(n3)
解法二:
DP求解,最长公共子序列变形一下,将字符串倒序进行DP,时间复杂度
O(n2)
解法三:
manacher
算法,可以百度一下算法的讲解,时间复杂度
O(n)
结果
Your runtime beats 78.46 % of cpp submissions
代码
class Solution {
public:
string longestPalindrome(string s) {
return manacher(s);
}
private:
string manacher(string s){
int len = s.length();
string str = "";
str += '$';
str += '#';
for(int i = 0;i < len;i++){
str += s[i];
str += '#';
}
len = str.length();
int *p = new int[len + 1];
int Max = 0, id = 0;
for(int i = 1;i < len;i++){
if(Max > i){
p[i] = min(p[2 * id - i], Max - i);
} else{
p[i] = 1;
}
while(str[i + p[i]]== str[i - p[i]]){
p[i]++;
}
if(i + p[i] > Max){
Max = i+ p[i];
id = i;
}
}
s = "";
Max = 0;
int loc = -1;
for(int i = 1; i < len;i++){
if(p[i] > Max){
Max = p[i];
loc =i;
}
}
for(int i = loc - Max + 1;i < loc + Max;i++){
if(str[i] != '#')
s += str[i];
}
delete(p);
return s;
}
};