1143. 最长公共子序列 JavaScript实现

1143. 最长公共子序列

题目链接

一、思想 – 动态规划

1、二维dp数组

dp[i][j]的含义是第一个字符串前i个字符和第二个字符串前j个字符的最大公共子序列
(i , j用来遍历两个字符串的指针)

2、状态转移方程

当不相等的时候,那么dp[i][j]的最大公共子序列,就在dp[i-1][j]和dp[i][j-1]中;再解释一下,假设求x和y的公共子序列,当他们两个的最后一个数相等,那么最后一个数一定在最大公共子序列中,就等于x和y都减去最后一个数的公共子序列。但如果x和y最后一个数不相同,那么如果要求最大公共子序列,最大公共子序列最多只能满足他们俩当中的一个,也就是只会在dp[i-1][j]和dp[i][j-1],因最后一个数不同
在这里插入图片描述

3、状态的初始化

在这里插入图片描述

4、遍历过程

dp[i][j] 依赖与 dp[i - 1][j - 1] , dp[i - 1][j], dp[i][j - 1],所以 i 和 j 的遍历顺序肯定是从小到大的。
在这里插入图片描述

5、举例理解

在这里插入图片描述

在这里插入图片描述

二、代码实现

var longestCommonSubsequence = function(text1, text2) {
    const m = text1.length,n = text2.length;

    // 1、定义一个二维数组,构成一个矩阵。
    // dp[i][j]对应的值就是当前最长公共子序列的长度
    const dp = Array.from(new Array(m+1), ()=>new Array(n+1).fill(0));
   
    // 2、对矩阵进行行列遍历,不断更新dp数组的值
    for(let i=1;i<=m;i++){
        for(let j=1;j<=n;j++){
            // 取text1和text2中的最后一个数进行比较
            const c1 = text1[i-1],c2 = text2[j-1];
            if(c1 == c2){
            	// 不断更新dp数组的值
                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[m][n];
};

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值