题目
难度:中等
思路
可以看出,回文子串去掉前后单词后,仍然是回文子串。
所以采用动态规划
初始状态:1个单词时,是回文子串;2个单词时,若单词相等,就是回文子串,否则不是;
递推公式:当满足 s[i]==s[j] 且 s[i+1 ~ j-1]是回文子串时,子串 s[i~j] 为回文子串,否则不是。
C++代码
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
vector<vector<int>>v(n, vector<int>(n));//新建 全0 二维数组
string res;
for (int len = 0; len < n; len++) {//子串长度-1
for (int i = 0; i + len < n; i++) {
int j = i + len;
if (len == 0) v[i][j] = 1;//子串长度为1时,肯定是回文
else if (len == 1) v[i][j] = (s[i] == s[j]);//长度为2时,两个相等即是回文
else { //长度>2时,看 前后字符是否相等 && 中间子串是否回文
v[i][j] = (s[i] == s[j] && v[i + 1][j - 1]);
}
if (v[i][j] && len + 1 > res.size()) //i到j是回文,且长度大于 旧回文子串
res = s.substr(i, len+1);
}
}
return res;
}
};