[LeetCode] Edit Distance(!!!!!DP)

7 篇文章 0 订阅

Edit Distance

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

这是一道非常经典也非常重要的题目,在解决了这个问题后我们还将进行一些推广。题目的意思输入两个字符串word1,word2,通过三种操作来将word2变成word1,计算出最少的操作次数。
这个问题也称为计算两个string的最小edit distance.

这个问题及推广有很多应用,一个是计算机生物学中,计算两个基因序列的相似性。一个是在机器翻译和语音识别中,进行语句的转换。

Edit Distance这个问题在转换的过程中,我们始终希望最小化的是操作次数或是操作代价(如果不同的操作有不同的代价的话)。

我们定义最小Edit Distance
为D(i,j),表示的是X[1,…i]和Y[1,..j]之间的edit distance

在更新D(i,j)时,我们使用DP的思想和bottom-up的策略。
初始化
D(i,0)=i; D(0,j) = j;
递推关系

        D(i-1,j) + 1

D = min D(i,j-1) +1
D(i-1,j-1) +1 if X(i) != Y(j)
if X(i) = Y(j)
以X =”intention” Y= “execution”为例,表的建立如下显示

这里写图片描述

这里写图片描述

我们计算了最小edit distance后,还可以计算backtrace 求每一步的操作。

这里写图片描述

int min(int a, int b){
    return a<b?a:b;
}
int minDistance(char* word1, char* word2){
    int len1 = strlen(word1);
    int len2 = strlen(word2);
    int i,j;
    int **D = (int **)malloc(sizeof(int*)*(len1+1));
    for(i = 0; i < len1+1; ++i)
        D[i] = (int *)malloc(sizeof(int)*(len2+1));
    for(j = 0; j < len2+1; ++j) 
        D[0][j]=j;
    for(i = 0; i < len1+1; ++i)
        D[i][0]=i;
    for(i = 1; i < len1+1; ++i)
        for(j = 1; j < len2+1; ++j)
            D[i][j]=min(D[i-1][j-1]+(word1[i-1]==word2[j-1]?0:1),min(D[i-1][j]+1,D[i][j-1]+1));
    return D[len1][len2];


}

这里的语言关键就是
1、二维数组的动态开辟,先开辟头指针,然后申请每一行的头指针
2、D的大小应该是两个字符串长度+1,因为行列需要初始化。

这个问题的升级版本一,不同的操作代价不一样,问题就变成了求解加权最小edit distance问题

这里写图片描述

应用场景一,在计算生物学中的应用,基因序列的对齐。
较为详细的说明,可以参考下面这篇stanford的slides
Stanford Minimum Edit Distance

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值