动态规划——最小编辑距离

1.问题描述

给定两个单词word1和word2,计算出将word1转换成word2所使用的最少操作数。
你可以对一个单词进行如下三种操作:
1.插入一个字符
2.删除一个字符
3.替换一个字符

示例1:

输入:word1="horse",word2="ros"
输出:3
解释:
horse->rorse(替换)
rorse->rose(删除)
rose->ros(删除)

2.问题解决

对于S1[1…n]和S2[1…m]两个序列
子问题:S1[1…i]和S2[1…j],即把S1[1…i]变为S2[1…j]需要的最少操作数,记为E(i, j)。
(1)如果已经计算出了E(i-1, j),则E(i, j)=E(i-1,j)+1,多的一个操作数是需要删除S1[ i ]。
(2)如果已经计算出了E(i, j-1),则E(i, j)=E(i, j-1)+1,多的一个操作数是在S1[ i ]后面插入S2[ j ]。
(3)如果已经求出了E(i-1, j-1),则E(i, j)=E(i-1, j-1)+dif
dif=0,当S1[ i ] = S2[ j ],此时不需要任何操作
dif=1,当S1[ i ] != S3[ j ],此时需要将S1[ i ]替换为S2[ j ]
初始条件:E(0, j)=j;E(i, 0)=i

因此,从S1[1…i]变成S2[i…j]主要有以上三种方式,哪种需要的操作数小,就用哪一种。

3.代码实现

int min(int a,int b,int c)
{
    int temp;
    temp=a<b?a:b;
    return temp<c?temp:c;
}

int minDistance(string word1,string word2)
{
    int m=word1.length();
    int n=word2.length();

    vector<vector<int>> cost(m+1,vector<int>(n+1));

    for(int i=0;i<=m;i++)//初始化cost数组
        cost[i][0]=i;
    for(int j=0;j<=n;j++)
        cost[0][j]=j;

    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(word1[i-1]==word2[j-1]
                cost[i][j]=cost[i-1][j-1];
            else
                cost[i][j]=1+min(cost[i-1][j],cost[i][j-1],cost[i-1][j-1]);
        }
    }
    return cost[m][n];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值