首先初始化一个(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这样来储存子串(好像比较占空间,不过两个源串短的话,这样会省代码量)