给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd" 输出: "bb"
class Solution
{
public:
string longestPalindrome(string s)
{
int len = s.size();
if(len == 0 || len == 1)
return s;
int start = 0; //回文字符串的其实位置
int max = 1; //回文字符串的长度
vector<vector<int>> dp(len, vector<int>(len));
for(auto i = 0; i < len; ++i)
{
dp[i][i] = 1; //让每个单个字符串都成为回文字符串,标志为 1
if(i < len - 1 && s[i] == s[i+1])
{
dp[i][i+1] = 1; //两个单个字符
max = 2;
start = i;
}
}
//上边的循环是给递推做基础的,递推是从一个或者两个字符串为基础推出三个长度的回文字符串
//i是从0开始递增的,一次只找三个长度的字符串, 大循环的遍历是3开始,慢慢加一操作,直到长度到达n个字符串的长度
for(auto l = 3; l <= len; l++)
{
for(auto i = 0; i+l-1 < len; i++)
{
int j = l + i -1; //终止字符串的位置
if(s[i] == s[j] && dp[i+1][j-1] == 1)
{
dp[i][j] = 1;
start = i;
max = l;
}
}
}
return s.substr(start, max);
}
};