我一直在研究“算法设计手册”的第8.2.1节“通过递归编辑距离”。 Skiena在本节中写道:“我们可以通过观察字符串中的最后一个字符必须匹配,替换,插入或删除来定义递归算法。”这让我感到奇怪,为什么最后一个字符呢?对于仅基于问题定义的任何字符都是如此。实际的Levenshtein距离算法从字符串的后面进行递归调用。为什么?没有理由你不能相反,对吗?它只是一种更简单,更优雅的语法吗?
我正在翻转算法,因此它从字符串的开头进行迭代。我的尝试在下面。我知道我的实现无法完全正常运行(例如:minDistance("industry", "interest")
返回5而不是6)。我花了几个小时试图弄清楚我在做什么错,但我没有看到。任何帮助将不胜感激。
var matchChar = (c,d) => c === d ? 0 : 1;
var minDistance = function(word1, word2) {
var stringCompare = function(s, t, i, j) {
if(i === s.length) return Math.max(t.length-s.length-1,0)
if(j === t.length) return Math.max(s.length-t.length-1,0)
if(cache[i][j] !== undefined) {
return cache[i][j]
}
let match = stringCompare(s,t,i+1,j+1) + matchChar(s[i], t[j]);
let insert = stringCompare(s,t,i,j+1) + 1;
let del = stringCompare(s,t,i+1,j) + 1;
let lowestCost = Math.min(match, insert, del)
cache[i][j] = lowestCost
return lowestCost
};
let s = word1.split('')
s.push(' ')
s = s.join('')
let t = word2.split('')
t.push(' ')
t = t.join('')
var cache = []
for(let i = 0; i < s.length; i++) {
cache.push([])
for(let j = 0; j < t.length; j++) {
cache[i].push(undefined)
}
}
return stringCompare(s, t, 0, 0)
}
答案 0 :(得分:1)
线条
if(i === s.length) return Math.max(t.length-s.length-1,0)
if(j === t.length) return Math.max(s.length-t.length-1,0)
我看错了。我认为他们应该
if(i === s.length) return t.length-j
if(j === t.length) return s.length-i