题目:5. Longest Palindromic Substring
类型:字符串
难度:中等
星级:五星推荐
版本1
两种方法
1.分奇偶暴力扩
2.manacher算法
class Solution {
public:
string longestPalindrome(string s) {
string res, ans;
res += "$#";
for(auto c : s){
res += c;
res += "#";
}
res += '*';
int p[100005]={0};
int r = 1, c = 0, m = 0;
for(int i = 1; i < res.size() - 1; i++){ //一定要从1开始,因为0位置是随便给的一个字符,防止越界的
p[i] = r > i ? min(r - i, p[2*c - i]) : 1;
while(res[i + p[i]] == res[i - p[i]]) p[i]++;
if(i + p[i] > r){
c = i;
r = i + p[i];
}
if(p[i] > m){
m = p[i];
ans.clear();
for(int j = i - p[i] + 1; j < p[i] + i; j++){
if(res[j] != '#') ans += res[j];
}
}
}
return ans;
}
};
版本2
class Solution {
public:
string longestPalindrome(string s) {
string res;
for(int i = 0; i < s.size(); i++){
//长度为奇数
for(int j = i, k = i; j >=0 && k < s.size() && s[j] == s[k]; j--, k++){
if(res.size() < k - j + 1) res = s.substr(j, k - j + 1);
}
//长度为偶数
for(int j = i, k = i + 1; j >=0 && k < s.size() && s[j] == s[k]; j--, k++){
if(res.size() < k - j + 1) res = s.substr(j, k - j + 1);
}
}
return res;
}
};
版本3
2020.3.29
class Solution {
public:
string longestPalindrome(string s) {
string res;
int n = s.size();
for(int i = 0; i < n; i++){
for(int j = i, k = i; j >= 0 && k < n && s[j]==s[k]; j--, k++){
if(res.size() < k-j+1) res = s.substr(j, k-j+1);
}
for(int j = i, k = i+1; j >= 0 && k < n && s[j]==s[k]; j--, k++){
if(res.size() < k-j+1) res = s.substr(j, k-j+1);
}
}
return res;
}
};