算法简介
编辑距离,又称Levenshtein距离(莱文斯坦距离也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
Levenshtein Distance算法
假设我们可以使用D[ i , j ]个步骤(可以使用一个二维数组保存这个值),表示将串s[ 1…i ] 转换为 串t [ 1…j ]所需要的最少步骤个数。即D[i][j] 表示 字符串s 的前 i 个字母和 字符串t 的前 j 个字母之间的编辑距离
- 在最基本的情况下,即在i等于0时,也就是说串s为空,那么对应的D[0,j] 就是 增加j个字符,使得s转化为t。
- 在j等于0时,也就是说串t为空,那么对应的D[i,0] 就是减少 i个字符,使得s转化为t。
- 当我们获得 D[i-1][j],D[i][j-1] 和 D[i-1][j-1] 的值之后就可以计算出 D[i][j]。
-
如果两个子串的最后一个字母相同,s[i] == t[j]为true 的情况下:
D[i][j] = 1 + min(D[i - 1][j], D[i][j - 1], D[i - 1][j - 1] - 1)
-
s[i] !=t[j] 为true时,我们将考虑替换最后一个字符使得他们相同:
D[i][j] = 1 + min(D[i - 1][j], D[i][j - 1], D[i - 1][j - 1])
算法示例
给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
示例 :
输入: word1 = “intention”, word2 = “execution”, 输出: 5
解释:
intention -> inention (删除 ‘t’)
inention -> enention (将 ‘i’ 替换为 ‘e’)
enention -> exention (将 ‘n’ 替换为 ‘x’)
exention -> exection (将 ‘n’ 替换为 ‘c’)
exection -> execution (插入 ‘u’)
分析: 采用编辑距离的动态规划解法。
class Solution {
public:
int minDistance(string word1, string word2) {
int size1=word1.size();
int size2=word2.size();
if(size1*size2==0)
return size1+size2;
vector<vector<int>>dp(size1+1,vector<int>(size2+1,0));
for(int i=0;i<=size1;i++)
dp[i][0]=i;
for(int i=0;i<=size2;i++)
dp[0][i]=i;
for(int i=1;i<=size1;i++){
for(int j=1;j<=size2;j++)
{
if(word1[i-1]==word2[j-1])
dp[i][j]=min(dp[i][j-1],min(dp[i-1][j],dp[i-1][j-1]-1))+1;
else
dp[i][j]=min(dp[i][j-1],min(dp[i-1][j],dp[i-1][j-1]))+1;
}
}
return dp[size1][size2];
}
};