程式碼隨想錄演算法訓練營第51天 | 115.不同的子序列 、583. 兩個字串的刪除操作 、72. 編輯距離

YuanYF6發表於2024-07-02

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

相關文章