给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例 1:
输入: "babad" 输出: "bab" 注意: "aba"也是一个有效答案。
示例 2:
输入: "cbbd" 输出: "bb"
我们用dp[ j ][ i ] 表示 字符串 i 到 j 是回文字符串 所以 j < i
当 i == j 时候, dp[i][j] = true; eg: " a " 本身就是回文 , 一个字母
当 j - i = 1 时候 ,即只有两个字母 , dp[ j ][ i ] = true 当 str [ i ] == str[ j ]
当 j - i > 2 的时候 , 很多个字母 ,dp[ j ] [ i ] = true 条件是 str[ i ] == str [ j ] 并且 dp[j+1][i-1] = true;
状态转移方程 dp[ j ] [ i ] = true 当 str[ j ] == str [ i ] && dp[j+1][i-1] = true;
eg : str = “abcba123456789” 我们无法直接判断 dp[ 0 ] [ 4 ] = true ,虽然我们眼睛看得到
所以 把问题分解的小一点, 当 str [ 0 ] == str[ 4] && dp[ 1] [3] = true 这个条件满足, 则等价于
dp[ 0] [ 4 ] = true
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
vector<vector<bool>> dp (n,vector<bool>(n,false));
int left = 0;
int right = 0;
int leng = 0;
for(int i = 0; i < n ;++i){
for( j = 0 ; j <= i ;++j){
dp[j][i] = s[i]==s[j]&& ( i-j<2|| dp[j+1][i-1] );
if(dp[j][i] && leng < i-j+1){
leng = i-j+1;
left = j;
right = i;
}
}
}
return s.substr(left,right-left+1);
}
};