先上效果
代码思路
对两个字符串使用 LCS 算法,获取最长子串,再通过这个最长子串找出新旧字符串中的其他字符段,对应为新增字符段、删除字符段,再以新增、删除、原有顺序拼接diff字符串。
代码实现
LCS 算法
// lcs 算法,用于找出两端字符串中最长子串,基本思路为动态规划
export function LcsFn(str1, str2) {
const n1 = str1.length;
const n2 = str2.length;
// 建立二维数组,使用动态规划存储子串长度
const lcsArr = new Array(n1 + 1).fill(null)
.map((_, index)=>new Array(n2 + 1).fill(0));
for (let i = 1; i < n1 + 1; i++) {
for(let j = 1; j< n2 + 1; j++) {
if(str1[i - 1] === str2[j - 1]) {
lcsArr[i][j] = lcsArr[i - 1][j - 1] + 1
}else {
lcsArr[i][j] = Math.max(lcsArr[i][j - 1], lcsArr[i - 1][j])
}
}
}
const sameStr = getStr(str1, str2, lcsArr);
return {str1, str2, lcsArr, sameStr}
}
// 根据二维数组输出子串具体字符
function getStr(str1, str2, lcsArr) {
const result = []
let i = str1.length,
j = str2.length
while (i > 0 && j > 0) {
if (str1[i - 1] === str2[j - 1]) {
result.unshift(str1[i - 1])
i--
j--
} else if (lcsArr[i][j - 1] > lcsArr[i - 1][j]) {
j--
} else {
i--
}
}
return result;
}
let str1 = 'eleocfvfbg'; // 最长相同子串为:'e,l,o,b,g' -- 长度9
let str2 = 'ledfdkakglowbgked'; // -- 长度14
输出 LCS算法的二维数组 并 找出最长相同子串结果: