方法1:中心回文法(时间复杂度O(n^2))
class Solution {
public:
string longestPalindrome(string s) {
int n = s.length();
if (n==0)
{
return "";
}
string ans = s.substr(0, 1);
for (int i = 0; i < n - 1;i++)
{
string str1 = longestPalindromeCore(s, i, i, n);
if (str1.length()>ans.length())
{
ans = str1;
}
string str2 = longestPalindromeCore(s, i, i + 1, n);
if (str2.length()>ans.length())
{
ans = str2;
}
}
return ans;
}
string longestPalindromeCore(string s, int pos1, int pos2, int n)
{
while (s[pos1] == s[pos2] && pos1 >= 0 && pos2 < n)
{
pos1--;
pos2++;
}
return s.substr(pos1 + 1, pos2 - pos1 - 1);
}
};
方法2:动态规划法(时间复杂度O(n^2),空间复杂度O(n^2))
class Solution {
public:
string longestPalindrome(string s) {
int n = s.length();
vector<vector<int>> dp(n, vector<int>(n, 0));
int start = 0;
int longest = 1;
for (int i = 0; i < n;i++)
{
dp[i][i] = 1;
if (s[i]==s[i+1]&&i<n-1)
{
start = i;
longest = 2;
dp[i][i + 1] = 2;
}
}
for (int len = 2; len < n;len++)
{
for (int i = 0; i + len < n;i++)
{
int end = i + len;
if (s[i]==s[end] && dp[i+1][end-1])
{
dp[i][end] = dp[i + 1][end - 1] + 2;
if (dp[i][end] > longest)
{
longest = dp[i][end];
start = i;
}
}
}
}
return s.substr(start, longest);
}
};
方法三:Manacher(待补充)