1.关于两个字符串的距离,一种自然度量就是看他们相互匹配的程度如何。 简单的说,编辑距离可以被看为将一个字符串变换为另一个字符串所需的最小编辑操作(插入,删除以及替换)
2. 一般采用dp来解决这个问题。dp首要问题就是定义子问题。
假设我们目标是寻找两个字符串x[1..m]和y[1..n]之间的编辑距离。 好的子问题是解决问题道路上的一个部分. 故我们考虑一下两个字符串的前缀x[1..i]与y[1..j]的编辑距离。
我们记该子问题为 E(i,j) 。所以,最终我们的目标就变成了求解 E(m,n)
3. 下面便是关键的步骤了:
x[1..i] 与y[1..j]的最佳对齐右侧的列只可能是如下三种情况之一:
x[i] - x[i]
- y[j] y[j]
(y末尾插入一个字符) (x末尾插入一个字符) (两者相同或者替换)
故我们可以得到以下的关系式:
E(i,j) = min { 1+E(i-1,j) , 1+E(i,j-1), E(i-1,j-1) } if E(i) == E (j)
min { 1+E(i-1,j) , 1+E(i,j-1), 1+E(i-1,j-1) } if E(i) != E (j)
4.所有我们可以得到如下的基本求解算法:
for i = 0,1,2, .... , m:
E(i,0) = i
for j = 0,1,2,....., n:
E(0,j) = j
for i=1,2,...., m:
for j = 1,2,...,n:
if E(i) == E (j):
E(i,j) = min { 1+E(i-1,j) , 1+E(i,j-1), E(i-1,j-1) }
else:
E(i,j) = min { 1+E(i-1,j) , 1+E(i,j-1), 1+E(i-1,j-1) }
return E(m,n)
一个leetcode上面的具体列子:
http://blog.csdn.net/jkwangbest/article/details/23430203
本文参考自 书籍<<算法概论>>