相似度:编辑距离--Levenshtein Distance

一、概念

字符串的编辑距离,又称为Levenshtein距离,由俄罗斯的数学家Vladimir Levenshtein在1965年提出。
Levenshtein距离是一种计算两个字符串间的差异程度的字符串度量(string metric)。我们可以认为Levenshtein距离就是从一个字符串修改到另一个字符串时,其中编辑单个字符(比如修改、插入、删除)所需要的最少次数。

二、思想

假设存在字符串A与字符串B,求字符串A至少经过多少步字符操作变成B?

解法

(1)假设字符串A长度为m,字符串B长度为n,建立(m+1)*(n+1)的矩阵dp
(2)Ax为字符串A的前i个字符,By为字符串B的前j个字符,dp[i][j]则为字符串Ax与By的最小编辑距离
对于字符Ax[i]与By[j],有以下几种情况:

1)情况1

假设字符串A与字符串B其中一个长度为0,如:i=0,此时:
对于将字符串A转为字符串B,只要不断的往字符串A后面添加字符即可,最小编辑距离即是字符串B的长度,即dp[0][j] = j
反过来,对于j=0,也有dp[i][0] = i

2)情况2–修改

假设Ax[0 : i-1]转为By[0 : j-1]需要进行的字符操作数dp[i-1][j-1] = opt,那么对于字符串Ax与By,如果:
此时Ax[i] = By[j],那么无需进行修改,即:dp[i][j] = dp[i-1][j-1] = opt
此时Ax[i] != By[j],那么将Ax[i]修改为By[j],操作数加1,即:dp[i][j] = dp[i-1][j-1] +1 = opt +1

3)情况3–插入

假设Ax[0 : i]转为By[0 : j-1]需要进行的字符操作数dp[i][j-1] = opt,那么此时只需要在字符串Ax的后面再插入一个与By[j]相同的字符即可,操作数加1,即:
dp[i][j] = dp[i][j-1] +1 = opt +1

4)情况3–删除

假设Ax[0 : i-1]转为By[0 : j]需要进行的字符操作数dp[i-1][j] = opt,那么此时只需要将字符串Ax的最后一个字符Ax[i]删除即可,操作数加1,即:
dp[i][j] = dp[i-1][j] +1 = opt +1

对于上述情况2到情况3,选择其中编辑距离最小的一个,以此重复直到dp矩阵最后一个位置,即dp[-1][-1]即为最小编辑距离。

三、实战

假设存在字符串A=‘cafe’,字符串B=‘coffee’,其最小编辑距离如下:

- By c o f f e e
Ax 0 1 2 3 4 5 6
c 1 0 1 2 3 4 5
a 2 1 1 2 3 4 5
f 3 2 2 1 2 3 4
e 4 3 3 2 2 2 3

(1)当i=0,此时Ax长度为0,
当j=0,此时By长度为0,即dp[0][0] = 0;
当i=1,此时By长度为1,即dp[0][1] = 1;
以此类推,dp值为序列长度
(2)当i=1,j=1,此时Ax[1] = c,By[1] = c,此时两个字符串相等,即
dp[1][1] = dp[0][0] = 0
(3)当i=2,j=1,此时Ax[2] = a,By[1] = c,此时两个字符串不相等,
由表得,dp[2][1] = dp[1][1] + 1 = 1,有最小编辑距离
(4)以此类推,可得最小编辑距离为3,即:cafe→caffe→coffe→coffee

猜你喜欢

转载自blog.csdn.net/sinat_33741547/article/details/80109168