解析:这道题是动态规划,当前状态依赖上一个状态,有点类似于KMP算法
dp[j][i] 表示子串 s(j)-s(i) 是否是回文,i表示当前字串为s(0)-s(i),j表示搜索的起始位置,当s[j] != s[i],s(j)-s(i) 不是回文;当s[j] = s[i] 时,只存在3种不同的状态:
- j=i,表示当前字串长度为1,自然就是回文
- j和i相邻,即 j + 1 = i,即当前子串长度为2,自然也是回文
- j和i不相邻,即 j + 1 < i,此时只要保证前面的字串s(j+1)-s(i-1)为回文,那s(j)(i)自然也就是回文
class Solution {
public:
string longestPalindrome(string s) {
int n = s.length();
int maxlen = 1;
int left = 0;
vector<vector<bool>> dp(n, vector<bool>(n, false));
for (int i = 0; i < n; ++i){
dp[i][i] = true;
for (int j = 0; j < i; ++j){
//(相邻或者上一个状态是回文)且前后两个字符相等
dp[j][i] = (s[i] == s[j]) && (i - j < 2 || dp[j+1][i-1]);
if (dp[j][i] && maxlen < i - j + 1){ //比当前最大长度要长
maxlen = i - j + 1;
left = j; //记录当前最长长度的起始位置
}
}
}
return s.substr(left, maxlen);
}
};
[1]https://www.cnblogs.com/grandyang/p/4464476.html