代码随想录算法训练营第四十四天|1143.最长公共子序列 、 1035.不相交的线 、 53. 最大子序和 、392.判断子序列

36 阅读1分钟

1143.最长公共子序列

相关链接:题目链接文章讲解 视频讲解

解题思路

代码实现

var longestCommonSubsequence = function(text1, text2) {
    var dp = new Array(text1.length+1).fill().map(()=>new Array(text2.length+1).fill(0));
    var arr1 = text1.split('');
    var arr2 = text2.split('');
    for(let i=1;i<=arr1.length;i++){
        for(let j=1;j<=arr2.length;j++){
            if(arr1[i-1] === arr2[j-1]){
                dp[i][j] = dp[i-1][j-1] +1;
            }else{
                dp[i][j] = Math.max(dp[i][j-1],dp[i-1][j]);
            }
        }
    }
    return dp[arr1.length][arr2.length];
};

1035.不相交的线

相关链接:题目链接文章讲解 视频讲解

解题思路

本质上就是求最长公共子序列

代码实现

var maxUncrossedLines = function(nums1, nums2) {
    var dp = new Array(nums1.length+1).fill().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][j-1],dp[i-1][j]);
            }
        }
    }
    return dp[nums1.length][nums2.length];
};

53. 最大子序和

相关链接:题目链接文章讲解 视频讲解

解题思路

代码实现

var maxSubArray = function(nums) {
    var result =-Infinity;
    var count =0;
    for(let i=0;i<nums.length;i++){
        count += nums[i];
        if(count>result) result = count;
        if(count < 0) count = 0;

    }
    return result;
};

var maxSubArray = function(nums) {
    var dp = new Array(nums.length);
    dp[0] = nums[0];
    for(let i=1;i<nums.length;i++){
        dp[i] =Math.max(dp[i-1] +nums[i],nums[i])
    }
    var result =-Infinity;
    for(let i=0;i<nums.length;i++){
        if(dp[i]>result){
            result = dp[i];
        }
    }
    return result;
};

392.判断子序列

相关链接:题目链接文章讲解 视频讲解

解题思路

本质上就是求最长公共子序列

代码实现

var isSubsequence = function(s, t) {
    var dp = new Array(s.length+1).fill().map(()=>new Array(t.length+1).fill(0));
    var arr1 = s.split('');
    var arr2 = t.split('');
    for(let i=1;i<=arr1.length;i++){
        for(let j=1;j<=arr2.length;j++){
            if(arr1[i-1] === arr2[j-1]){
                // console.log(dp[i-1][j-1])
                dp[i][j] = dp[i-1][j-1] + 1;
            }else{
                dp[i][j] = Math.max(dp[i][j-1],dp[i-1][j]);
            }
        }
    }
    return dp[arr1.length][arr2.length] === s.length;
};