动态规划,时间复杂度O(n^2)
string longestPalindrome(const string &str) {
int n = str.length();
int start = 0;
int length = 1;
bool dp[n][n];
for (int j = 0; j < n; ++j) {
for (int i = 0; i <= j; ++i) {
if (j - i < 2)dp[i][j] = (str[i] == str[j]);
else if (str[i] == str[j])dp[i][j] = dp[i + 1][j - 1];
else dp[i][j] = false;
if (dp[i][j] && j - i + 1 > length) {
start = i;
length = j - i + 1;
}
}
}
return str.substr(start, length);
}
manacher算法求解,时间复杂度O(n)
string longestPalindromeManacher(const string &str) {
int n = str.length();
char s[n * 2 + 3];
s[0] = '$';
s[1] = '#';
for (int i = 0, j = 2; i < n; ++i) {
s[j++] = str[i];
s[j++] = '#';
}
s[n * 2 + 2] = '\0';
int newLen = n * 2 + 2;
int p[newLen];
int id = 1;
int mx = -1;
int start = 0;
int maxLen = 1;
for (int i = 1; i < newLen; ++i) {
if (i < mx)p[i] = min(p[2 * id - i], mx - i);
else p[i] = 1;
while (s[i - p[i]] == s[i + p[i]])++p[i];
if (mx < i + p[i]) {
id = i;
mx = i + p[i];
}
if (p[i] - 1 > maxLen) {
maxLen = p[i] - 1;
if (s[i - maxLen] == '#')start = (i - maxLen + 1) / 2 - 1;
else start = (i - maxLen) / 2 - 1;
}
}
return str.substr(start, maxLen);
}
Reference
- Manacher 算法