最长公共子序列

132 阅读1分钟

说明

找出两个字符串序列的最长子序列(在两个字符串序列中以相同的顺序出现,但不要求联系的字符串序列)的长度

例子

找出w1='acbaed',w2='abcadf'的最长公共子序列

思路

w1,w2构建矩阵,,项相同则加1,如下

image.png

代码

function lcs(w1, w2) {
  // 初始化矩阵
  let matrix = [];
  for (i = 0; i <= w1.length; i++){
    matrix[i] = []
    for (let j = 0; j <= w2.length; j++) {
      matrix[i][j] =0
    }
  }
  // 矩阵重0开始算,是因为(w1[i-1]===w2[j-1])需要取上一轮的值
  for (i = 1; i <= w1.length; i++){
    for (j = 1; j <= w2.length; j++) {
      if(w1[i-1]===w2[j-1]){
        // 应为w1[i-1]或者w2[j-1]的项只能对应一个值,所以即使w1[i-1]===w2[j-1]也只能取上一轮的前一个值+1
        matrix[i][j] =matrix[i-1][j-1]+1
      }else{
        // 前一个值
        let a = matrix[i][j-1]
        // 上一轮的值
        let b = matrix[i-1][j]
        matrix[i][j] =Math.max(a,b)
      }

    }
  }
  return matrix   
}
console.log(lcs("abcadf", "acbaed"));