js最长公共子序列

本文介绍了如何使用JavaScript解决最长公共子序列问题。通过初始化一个(m+1)X(n+1)的二维数组,根据字符是否相等选择左方或上方的较长序列,最终得到最右下角的值作为最长公共子序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先初始化一个(m+1)X(n+1)的二维数组,从(1,1)开始遍历
如果i==j,则按照左上方对角线连接当前字符形成新的最长公共子序列
如果不相等就判断左方和上方哪个长用哪个
遍历结束之后最右下角就是我们需要的字串了

function lcs(wordX, wordY) {
  let m = wordX.length;
  let n = wordY.length;
  let solution = [];
  //初始化一个二维数组,长度宽度分别为两个字符串的长度+1,内容为动态规划当前两分串的最长公共
  for (let i = 0; i <= m; ++i) {
    solution[i] = []; //{1}
    for (let j = 0; j <= n; ++j) {
      solution[i][j] = ""; //{2}
    }
  }
  for (let i = 1; i <= m; i++) {
    for (let j = 1; j <= n; j++) {
      if (wordX[i - 1] == wordY[j - 1]) {
        //因为字母长度少一位,我们二维数组从1,1开始用
        //如果正好相同取左上方+1
        //仅有这种情况的时候才会根据对角线添加一个字符
        solution[i][j] = solution[i-1][j-1] + wordX[i-1]; //{3}
      } else {
        //如果不同分情况取左或上复制过来
        let a = solution[i - 1][j].length;
        let b = solution[i][j - 1].length;
        solution[i][j] = a > b ? solution[i-1][j] : solution[i][j - 1]; //{4}
      }
    }
  }
  console.log(solution[m][n])
  return solution[m][n].length;
}
console.log(lcs("abcbdabf", "bdcabaf"));
//bdabf,4

在这里插入图片描述
solution这样来储存子串(好像比较占空间,不过两个源串短的话,这样会省代码量)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值