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

文章目录

  • 一、647.回文子串
  • 二、516.最长回文子序列


一、647.回文子串

题目链接

代码如下:

class Solution {
public:
    int countSubstrings(string s) {
        vector<vector<bool>> dp(s.size(), vector<bool> (s.size(), false));
        int result = 0;
        for (int i = s.size() - 1; i >= 0; i--) {
            for (int j = i; j < s.size(); j++) {
                // 相等时分三种情况:一个字母a,true;两个字母aa,true;大于两个字母,中间是回文子串,true
                if (s[i] == s[j] && (j - i <= 1 || dp[i + 1][ j - 1])) {
                    dp[i][j] = true;
                    result++;
                } 
            }
        }
        return result;
    }
};


二、516.最长回文子序列

题目链接

代码如下:

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        vector<vector<int>> dp(s.size(), vector<int> (s.size(), 0)); // dp数组含义:在i到j的范围内(闭区间)最长回文子序列的长度
        for (int i = 0; i < s.size(); i++) dp[i][i] = 1;
        for (int i = s.size() - 1 ; i >= 0; i--) {
            for (int j = i + 1; j < s.size(); j++) {
                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]); // s[i]s[j]不相等,考虑i+1到j范围和i到j+1范围内的最长回文子序列
                }
            }
        }
        return dp[0][s.size() - 1];
    }
};


附:b站上非常好的动态规划dp数组推导视频

你可能感兴趣的:(算法)