程式碼隨想錄演算法訓練營第50天 | 1143.最長公共子序列 、1035.不相交的線 、53. 最大子序和、392.判斷子序列

YuanYF6發表於2024-06-30

這幾題都挺類似,都是求最長公共子序列,有些題目稍微變了下
1143.最長公共子序列

體會一下本題和 718. 最長重複子陣列 的區別
影片講解:https://www.bilibili.com/video/BV1ye4y1L7CQ
https://programmercarl.com/1143.最長公共子序列.html

/**
 * @param {string} text1
 * @param {string} text2
 * @return {number}
 */
var longestCommonSubsequence = function(text1, text2) {
    const dp = new Array(text1.length+1).fill(0).map(()=>new Array(text2.length + 1).fill(0));
    for (let i=1;i<=text1.length;i++) {
        for (let j=1;j<=text2.length;j++) {
            if (text1[i-1] === text2[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]);
            }
        }
    }
    return dp[text1.length][text2.length];
};

1035.不相交的線

其實本題和 1143.最長公共子序列 是一模一樣的,大家嘗試自己做一做。
影片講解:https://www.bilibili.com/video/BV1h84y1x7MP
https://programmercarl.com/1035.不相交的線.html

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
 */
var maxUncrossedLines = function(nums1, nums2) {
const dp = new Array(nums1.length+1).fill(0).map(()=>new Array(nums2.length + 1).fill(0));
    for (let i=1;i<=nums1.length;i++) {
        for (let j=1;j<=nums2.length;j++) {
            if (nums1[i-1] === nums2[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]);
            }
        }
    }
    return dp[nums1.length][nums2.length];
};
  1. 最大子序和

這道題我們用貪心做過,這次 再用dp來做一遍
影片講解:https://www.bilibili.com/video/BV19V4y1F7b5
https://programmercarl.com/0053.最大子序和(動態規劃).html

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
    const dp = new Array(nums.length);
    dp[0] = nums[0];
    let max = nums[0];
    for (let i=1;i<nums.length;i++) {
        dp[i] = Math.max(dp[i-1]+nums[i], nums[i]);
        if (dp[i] > max) {
            max = dp[i];
        }
    }
    return max;
};

392.判斷子序列

這道題目算是 編輯距離問題 的入門題目(畢竟這裡只是涉及到減法),慢慢的,後面就要來解決真正的 編輯距離問題了
https://programmercarl.com/0392.判斷子序列.html

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isSubsequence = function(s, t) {
    const dp = new Array(s.length+1).fill(0).map(()=>new Array(t.length + 1).fill(0));
    for (let i=1;i<=s.length;i++) {
        for (let j=1;j<=t.length;j++) {
            if (s[i-1] === t[j-1]) {
                dp[i][j] = dp[i-1][j-1] + 1;
            } else {
                dp[i][j] = dp[i][j-1];
            }
        }
    }
    return dp[s.length][t.length] === s.length ? true : false;
};

相關文章