代码随想录算法训练营第五十七天 |647. 回文子串、516. 最长回文子序列

69 阅读1分钟

代码随想录算法训练营第五十七天 |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];
         }
     };