注意这题求的是子串不是子序列
class Solution { public: string longestPalindrome(string s) { if(s.size()<2) return s; int len = s.length(); int maxlen = 1; int start = 0; vector<vector<int>> dp(len, vector<int>(len,0)); for(int i = 0; i < len; i++) dp[i][i] = 1; for(int L = 2; L <=len; L++) // L是子串长度 for(int i = 0; i < len; i++){ // i字符串开始位置 int j = L + i -1; // 右边界 if(j>=len) // 右边界超出范围 break; if(s[i]!=s[j]) // 不等于说明不是回文子串 dp[i][j] = 0; else{ if(j-i<3) // 小于3说明中间只有一个元素或者没有元素 dp[i][j] = 1; else // 如果中间有多个元素,则判断dp[i+1][j-1] dp[i][j] = dp[i+1][j-1]; } if(dp[i][j]==1&&L > maxlen){ // 更新 maxlen = L; start = i; } } return s.substr(start, maxlen); } };