编辑距离算法(Minimum Edit Distance,MED)

算法简介

  编辑距离,又称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]。
  1. 如果两个子串的最后一个字母相同,s[i] == t[j]为true 的情况下:
    D[i][j] = 1 + min(D[i - 1][j], D[i][j - 1], D[i - 1][j - 1] - 1)

  2. 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]; 
    }
};
发布了84 篇原创文章 · 获赞 7 · 访问量 3912

猜你喜欢

转载自blog.csdn.net/u014618114/article/details/104743470