Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
1、动态规划
class Solution {
public:
string longestPalindrome(string s) {
if(s == "" || s.length()==0)
return "";
int len = s.length();
bool flag[len][len];
string res = "";
int start = 0;
int maxLen = 0;
for(int i=len-1;i>=0;i--)
{
for(int j=i;j<len;j++)
{
if(s[i]==s[j] && (j-i<=2 || flag[i+1][j-1]))
{
flag[i][j] = true;
if(maxLen<j-i+1)
{
maxLen=j-i+1;
start = i;
//res = s.substr(i,maxLen);
}
}else{
flag[i][j] = false;
}
}
}
return s.substr(start,maxLen);
}
};
2、 Manacher算法处理字符串回文
class Solution {
public:
string longestPalindrome(string s) {
string t = "$";
for (char ch : s) {
t += '#';
t += ch;
}
t += '#';
int len = t.length();
// t为处理过的字符串,p为记录长度的数组
int p[t.length()];
// mx为已判断回文串最右边位置,id为中间位置,mmax记录p数组中最大值
int mx = 0, id = 0, mmax = 0;
int right = 0;
for (int i = 1; i < len; i++) {
p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;
while (t[i + p[i]] == t[i - p[i]])
p[i]++;
if (i + p[i] > mx) {
mx = i + p[i];
id = i;
}
if (mmax < p[i]) {
mmax = p[i];
right = i;
}
}
// 最长为mmax - 1
return s.substr(right/2 - mmax/2, mmax-1);
}
};