代码随想录算法训练营第五十七天 |647. 回文子串、516. 最长回文子序列
647. 回文子串
题目链接:647. 回文子串
- dp含义:以i为开头,j为结尾的子串是不是回文子串
- 递推公式:
if(words[i] == words[j]) - 遍历顺序: 从下往上,因为需要知道
[i + 1][j - 1], [i + 1][j], [i][j - 1] - 中心扩展法,空间复杂度O(1)
516. 最长回文子序列
题目链接:516. 最长回文子序列
- dp含义:以i为开头,j为结尾的字符中回文子串的最长长度
- 递推公式:
if(words[i] == words[j]) dp[i][j] = dp[i + 1][j - 1] + 2 - 遍历顺序: 从下往上,因为需要知道
[i + 1][j - 1], [i + 1][j], [i][j - 1] -
class Solution { public: int longestPalindromeSubseq(string s) { int len = s.size(); vector<vector<int>> dp(len + 1, vector<int>(len + 1)); for (int i = len - 1; i >= 0; i--) { for (int j = i; j < len; j++) { if(j == i) { dp[i][j] = 1; continue; } if (s[i] == s[j]) { dp[i][j] = dp[i + 1][j - 1] + 2; } else { dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]); } } } return dp[0][len - 1]; } };