代码随想录算法训练营第51天 | 115.不同的子序列 、583. 两个字符串的删除操作 、72. 编辑距离

115.不同的子序列

但相对于刚讲过 392.判断子序列,本题 就有难度了 ,感受一下本题和 392.判断子序列 的区别。
https://programmercarl.com/0115.不同的子序列.html

/**
 * @param {string} s
 * @param {string} t
 * @return {number}
 */
var numDistinct = function(s, t) {
    if (s.length < t.length) {
        return 0;
    }
    const dp = new Array(s.length + 1).fill(0).map(()=>new Array(t.length + 1).fill(0));
    let lens = s.length;
    let lent = t.length;
    for (let i=0;i<=lens;i++) {
        dp[i][0] = 1
    }
    for (let j=1;j<=lent;j++) {
        dp[0][j] = 0;
    }

    for (let i=1;i<=lens;i++) {
        for (let j=1;j<=lent;j++) {
            if (s[i-1] === t[j-1]) {
                dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
            } else {
                dp[i][j] = dp[i-1][j];
            }
        }
    }

    return dp[lens][lent];
};
  1. 两个字符串的删除操作

本题和动态规划:115.不同的子序列 相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的。
https://programmercarl.com/0583.两个字符串的删除操作.html

注意dp初始化的值  两种方法
/**
 * @param {string} word1
 * @param {string} word2
 * @return {number}
 */
var minDistance = function(word1, word2) {
    const len1 = word1.length;
    const len2 = word2.length;
    const dp = new Array(len1 + 1).fill(0).map(()=>new Array(len2+1).fill(0));
    for (i=1;i<=len1;i++) {
        dp[i][0] = i;
    }
    for (j=1;j<=len2;j++) {
        dp[0][j] = j;
    }
    for (let i=1;i<=len1;i++) {
        for (let j=1;j<=len2;j++) {
            if (word1[i-1] === word2[j-1]) {
                dp[i][j] = dp[i-1][j-1];
            } else {
                dp[i][j] = Math.min(dp[i-1][j] + 1, dp[i][j-1] + 1);
            }
        }
    }
    return dp[len1][len2];
};

/**
 * @param {string} word1
 * @param {string} word2
 * @return {number}
 */
var minDistance = function(word1, word2) {
    let len1 = word1.length;
    let len2 = word2.length;
    const dp = new Array(len1 + 1).fill(0).map(()=>new Array(len2).fill(0));
    let max = 0;
    for (let i=1;i<=len1;i++) {
        for (let j=1;j<=len2;j++) {
            if (word1[i-1] === word2[j-1]) {
                dp[i][j] = dp[i-1][j-1] + 1;
            } else {
                dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
            }
            if (max < dp[i][j]) {
                max = dp[i][j];
            }
        }
    }
    return len1 + len2 - 2*max;

};
  1. 编辑距离

最终我们迎来了编辑距离这道题目,之前安排题目都是为了 编辑距离做铺垫。
https://programmercarl.com/0072.编辑距离.html

/**
 * @param {string} word1
 * @param {string} word2
 * @return {number}
 */
var minDistance = function(word1, word2) {
    const len1 = word1.length;
    const len2 = word2.length;
    const dp = new Array(len1 + 1).fill(0).map(()=>new Array(len2 + 1).fill(0));
    for (let i=0;i<=len1;i++) {
        dp[i][0] = i;
    }
    for (let j=0;j<=len2;j++) {
        dp[0][j] = j;
    }
    for (let i=1;i<=len1;i++) {
        for (let j=1;j<=len2;j++) {
            if (word1[i-1] === word2[j-1]) {
                dp[i][j] = dp[i-1][j-1];
            } else {
                dp[i][j] = Math.min(dp[i-1][j] + 1, dp[i][j-1] + 1, dp[i-1][j-1] + 1);
            }
        }
    }
    return dp[len1][len2];
};

编辑距离总结篇
做一个总结吧
https://programmercarl.com/为了绝杀编辑距离,卡尔做了三步铺垫.html

posted @ 2024-07-02 23:59  YuanYF6  阅读(1)  评论(0编辑  收藏  举报