动态规划
定义
应用
步骤
举例
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。详细参考:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zui-chang-hui-wen-zi-chuan-by-leetcode-solution/
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
输入: “cbbd”
输出: “bb”
对于一个子串而言,如果它是回文串,并且长度大于 22,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串ababa,如果我们已经知道bab 是回文串,那么 ababa 一定是回文串,这是因为它的首尾两个字母都是 a。
那么我们就可以写出动态规划的状态转移方程:
P(i, j) = P(i+1, j-1)^(si == sj)
也就是说,只有s[i+1:j−1] 是回文串,并且 s 的第 i 和 j个字母相同时,s[i:j]才会是回文串。
class Solution {
public:
string longestPalindrome(string s) {
int size = s.size();
int max = 0;
int begin = 0;
vector<vector<int>> dp(size, vector<int>(size, 0));
for (int i = 0; i < size; i++) {
dp[i][i] = 1;
}
for (int j = 0; j < size; j++) {
for (int i = 0; i < j; i++) {
if (s[i] != s[j]) {
dp[i][j] = 0;
} else {
if (j - i < 3) {
dp[i][j] = 1;
} else {
dp[i][j] = dp[i + 1][j - 1];
}
}
if (dp[i][j] && (j - i > max)) {
max = j - i;
begin = i;
}
}
}
return string(s, begin, max + 1);
}
};