问题:给定一个源串和目标串,能够对源串进行如下操作:
在给定位置上插入一个字符
替换任意字符
删除任意字符
要求写一个程序,返回最少的操作数,使得对源串进行这些操作后等于目标串。源串和目标串的长度都小于2000。
关于编辑距离
编辑距离(Edit Distance
),又称
Levenshtein
距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将kitten
一字转成
sitting
:
sitten (
k
→
s
)
sittin (
e
→
i
)
sitting (→
g
)
俄罗斯科学家Vladimir Levenshtein
在
1965
年提出这个概念。
常见的思路是动态规划,下面是简单的DP
状态方程:
//动态规划:
//f[i,j]表示
d[0...i]与
s[0...j]的最小编辑距离,
d为目标串,
s
为源串。
f[i,j] = min { f[i-1,j]+1, f[i,j-1]+1, f[i-1,j-1]+(s[i]==d[j]?0:1) }
//分别表示:添加
1
个,删除
1
个,替换
1
个(相同就不用替换)。
Java代码:
https://github.com/JiangJiafu/Algorithm/blob/master/src/MinimumEditDistance.java
新浪博客放代码不方便,常常被莫名其妙地更改!!!转到github上了。
参考资料:
http://ccl.pku.edu.cn/doubtfire/Course/Computational Linguistics/contents/Minimum Edit Distance.pdf