题目:
思路:
lev[i][j]用来表示字符串a的[1…i]和字符串b[1…j]的levenshtein距离;
插入和删除操作互为逆过程:a删除指定字符变b等同于b插入指定字符变a;
如果a[i] == b[j],则说明a[i]和b[j]分别加入a,b之后不会影响levenshtein距离,lev[i][j] = lev[i-1][j-1] + 0;
如果a[i] != b[j],则需要考虑3种情况的可能:
a中插入字符b[j],只需计算当前1步 + a的[1…i - 1]与b[1…j]的levenshtein距离,即lev[i][j] = lev[i-1][j] + 1;
b中插入字符a[i],只需计算当前1步 + a的[1…i]与b[1…j - 1]的levenshtein距离,即lev[i][j] = lev[i][j-1] + 1;
a[i]替换成b[j],lev[i][j] = lev[i-1][j-1] + 1;
取这4种情况的最小值。
二维数组边缘都是+1步
提交:
while ((line = readline())) {
line = ' ' + line
let n = line.length
let line2 = readline()
line2 = ' ' + line2
let m = line2.length
let lev = []
for (let i = 0; i < n; i++) {
lev[i] = new Array(m)
lev[i][0] = i
}
for (let j = 0; j < m; j++) {
lev[0][j] = j
}
// lev[0][0] = line[0] === line2[0] ? 0 : 1
for (let i = 1; i < n; i++) {
for (let j = 1; j < m; j++) {
let cost = line[i] === line2[j] ? 0 : 1
lev[i][j] = Math.min(lev[i - 1][j - 1] + cost, lev[i - 1][j] + 1, lev[i][j - 1] + 1)
}
}
console.log(lev[n - 1][m - 1])
}