这没有完成,因为您不能同时编辑这两个字符串。编辑距离的定义(来自维基百科)是:
将 a 转换为 b 的最小权重系列编辑操作。
因此,您正在专门寻找(权重)要对字符串 a 执行的一系列操作,以将其转换为字符串 b。
另外,编辑距离不一定是对称的。如果插入和删除的成本相同,则距离是对称的:d(a,b) = d(b,a)
以维基百科为例,但成本不同:
- 插入成本:w_ins = 1
- 删除成本:w_del = 2
- 替换成本:w_sub = 1
kitten和坐着的距离还是3,
kitten -> sitten (substitution k->s, cost 1)
sitten -> sittin (substitution e->i, cost 1)
sittin -> sitting (insertion of g, cost 1)
=> d(kitten, sitting) = 3
但是坐着和小猫的距离不是:
sitting -> kitting (substitution s->k, cost 1)
kitting -> kitteng (substitution i->e, cost 1)
kitteng -> kitten (deletion of g, cost 2)
=> d(kitten, sitting) = 4
你看到d(kitten, sitting) != d(kitten, sitting)。
另一方面,如果您确实使用对称成本,就像 Levenshtein 距离(它是具有单位成本的编辑距离)所做的那样,您可以假设 d(a,b) = d(b,a) 成立。那么你也不会通过考虑相反的情况来赢得任何东西。你丢失的是哪个字符在哪个字符串中被替换的信息,这使得之后提取操作序列变得更加困难。
您在问题中显示的Wagner-Fisher algorithm 可以通过以最小成本回溯路径从 DP 矩阵中提取它。考虑 to 和 foo 之间的这两个带有单位成本的编辑矩阵:
t o f o o
f 1 2 t 1 2 3
o 2 1 o 2 1 2
o 3 2
请注意,如果您转置d(to, foo) 的矩阵,则会得到d(foo, to) 的矩阵。请注意,这样,第一个矩阵中的插入变为第二个矩阵中的删除,反之亦然。所以这就是你正在寻找的这种对称性再次出现的地方。
我希望这会有所帮助:)