leetcode:Edit Distance 动态规划--用于求两个词之间的相似度

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29108585/article/details/54931577

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:

a) Insert a character
b) Delete a character
c) Replace a character

如何找到两个strings的minimun edit distance呢?要知道把一个string转换为另一个string可以有很多种方法(或者说“路径“)。我们所知道起始状态(第一个string)、终止状态(另一个string)、基本操作(插入、删除、替换),要求的是最短路径。
对于如下两个strings:
X的长度为n
Y的长度为m
我们定义D(i,j)为 X 的前i个字符 X[1...i] 与 Y 的前j个字符 Y[1...j] 之间的距离,其中0<i<n, 0<j<m,因此X与Y的距离可以用D(n,m)来表示。
假如我们想要计算最终的D(n,m),那么可以从头开始,先计算D(i, j) (i和j从1开始)的值,然后基于前面的结果计算更大的D(i, j),直到最终求得D(n,m)。
算法过程如下图所示:

上图中使用的是”Levenshtein Distance“即替换的成本为2.
请读者深入理解一下上图中的循环体部分: D(i,j)可能的取值为:
1. D(i-1, j) +1 ;
2. D(i, j-1) +1 ;
3. D(i-1, j-1) + 2 (当X新增加的字符和Y新增加的字符不同时,需要替换)或者 + 0(即两个字符串新增加的字符相同)
下图即对字符串 INTENTION 和 EXECUTION 一步步求ED形成的表。左上角画红圈的8就是两个字符串间的最小ED。
class Solution {
public:
    int minDistance(string word1, string word2) {
        int distance[word1.size()+1][word2.size()+1];
        memset(distance,0,sizeof(distance));
        for (int i = 1; i <=word1.size() ; ++i) distance[i][0]=i;
        for (int j = 1; j <=word2.size() ; ++j) distance[0][j]=j;	
        for (int i = 1; i <=word1.size() ; ++i)
        {
        	for (int j = 1; j <=word2.size() ; ++j)
        	{
        		distance[i][j]=min(min(distance[i-1][j]+1,distance[i][j-1]+1),distance[i-1][j-1]+(word1[i-1]==word2[j-1]?0:2));
        	}
        }
        return distance[word1.size()][word2.size()];
    }
            
};

注意:除了一维的动态规划,还有二维的动态规划F(D[i][j])=F(D[i-1][j-1],D[i-1][j],D[i][j-1])

阅读更多
换一批

没有更多推荐了,返回首页