5.最长回文子串
给你一个字符串 s,找到 s 中最长的 回文 子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
-
基于动态规划的思想,判断一个子串是不是回文串,首先判断首尾是否相同,如果首尾相同,则等价于判断该子串的子串。
-
状态转移方程:P(i,j)=P(i+1,j−1)∧(S_i == S_j )
-
代码
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
if (n < 2) {
return s;
}
int max_len = 1;
int begin = 0;
vector<vector<int>> dp(n, vector<int>(n));
for (int i = 0; i < n; i++) {
dp[i][i] = true;
}
for (int L = 2; L <= n; L++) {
for (int i = 0; i< n; i++) {
int j = L + i - 1;
if (j >= n) {
break;
}
if (s[i] != s[j]) {
dp[i][j] = false;
} else {
if (j - i < 3) {
dp[i][j] = true;
} else {
dp[i][j] = dp[i+1][j-1];
}
}
if (dp[i][j] && j - i + 1 > max_len) {
max_len = j - i + 1;
begin = i;
}
}
}
return s.substr(begin, max_len);
}
};

浙公网安备 33010602011771号