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

1143. 最长公共子序列 JavaScript实现,第1张

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 = new Array(m + 1).fill(0).map(() => 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];
};

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1320547.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-11
下一篇 2022-06-11

发表评论

登录后才能评论

评论列表(0条)

保存