Levenshtein 距离(字符串距离)

Levenshtein 距离,又称编辑距离

算法基本原理:假设我们可以使用dp[ i , j ]个步骤(可以使用一个二维数组保存这个值),表示将串s[ 1…i ] 转换为 串t [ 1…j ]所需要的最少步骤个数,那么,在最基本的情况下,即在i等于0时,也就是说串s为空,那么对应的dp[0,j] 就是 增加j个字符,使得s转化为t,在j等于0时,也就是说串t为空,那么对应的d[i,0] 就是 减少 i个字符,使得s转化为t。我们假设s串为操作串,即所有操作都在s串中进行。t串为目标串,即把s串转化为t串。

1)初始化

在i等于0时,说明s串没有数据,直接一位一位插入数据。

在j等于0时,需要s串一步一步删除数据。

于是,

for(int i=0;i<=n;i++)
        dp[i][0]=i;
for(int i=0;i<=m;i++)
        dp[0][i]=i;

2)转移方程

要求dp[i][j],需要dp[i-1][j],dp[i][j-1],dp[i-1][j-1]

转移方式有三种:

1)我们可以在 s[1…i] 转换为 t[1…j-1]的基础(即在dp[i][j-1]的基础上)上得出递推公式,

对于dp[i][j],由于t[j]的加入,s串也需要加上t[j],所以dp[i][j]=dp[i][j-1]+1;

2)我们可以在s[1..i-1]转换为t[1..j]的基础上(即在dp[i-1][j]的基础上)得出递推公式

对于dp[i][j],直接删去s[i],所以dp[i][j]=dp[i-1][j]+1;

3)我们可以在 s[1…i-1] 转换为 t [1…j-1]的基础上(即dp[i-1][j-1])得出递推公式,

直接比较s[i]和t[j],如果相等,dp[i][j]=dp[i-1][j-1];

如果不相等,s串的s[i]改为t[j],dp[i][j]=dp[i-1][j-1]+1;

所以dp[i][j]最终结果是三者最小的

for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++){
        dp[i][j]=min(dp[i-1][j],dp[i][j-1])+1;
        dp[i][j]=min(dp[i][j],dp[i-1][j-1]+(s[i-1]!=t[j-1]));
    }





你可能感兴趣的:(模板)