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

  1. 回文子串

动态规划解决的经典题目,如果没接触过的话,别硬想 直接看题解。
https://programmercarl.com/0647.回文子串.html

这两题都好难,比较难理解,特别是dp的定义和之前不太一样,而且是一维数组,但是dp是二维数组
这题主要计算字串有多少个是回文串,所以dp值定义成true和false,再用一个变量统计有多少个true
/**
 * @param {string} s
 * @return {number}
 */
var countSubstrings = function(s) {
    const dp = new Array(s.length + 1).fill(false).map(()=> new Array(s.length + 1).fill(false));
    let res = 0;
    for (let i=s.length-1;i>=0;i--) {
        for (let j=i;j<=s.length;j++) {
            if (s[i] === s[j]) {
                if (j-i<=1) {
                    dp[i][j] = true;
                    res++;
                } else if (dp[i+1][j-1]) {
                    dp[i][j] = true;
                    res++;
                }
            }
        }
    }
    return res;
};

516.最长回文子序列
647. 回文子串,求的是回文子串,而本题要求的是回文子序列, 大家要搞清楚两者之间的区别。
https://programmercarl.com/0516.最长回文子序列.html

这题也难,但是也有坑,最终的取值是个坑,要明确理解dp的定义
/**
 * @param {string} s
 * @return {number}
 */
var longestPalindromeSubseq = function(s) {
    const dp = new Array(s.length).fill(0).map(()=>new Array(s.length).fill(0));
    for (let i=0;i<s.length;i++) {
        dp[i][i] = 1;
    }

    for (let i=s.length-1;i>=0;i--) {
        for (let j=i+1;j<s.length;j++) {
            if (s[i] === s[j]) {
                dp[i][j] = dp[i+1][j-1] + 2;
            } else {
                dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
            }
        }
    }
    return dp[0][s.length-1];
};

动态规划总结篇
https://programmercarl.com/动态规划总结篇.html

posted @ 2024-07-03 23:56  YuanYF6  阅读(8)  评论(0)    收藏  举报