编辑距离-dp进阶

题目重现<51Nod - 1183 >

编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将kitten一字转成sitting:
sitten (k->s)
sittin (e->i)
sitting (->g)
所以kitten和sitting的编辑距离是3。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。
给出两个字符串a,b,求a和b的编辑距离。
Input
第1行:字符串a(a的长度 <= 1000)。 
第2行:字符串b(b的长度 <= 1000)。
Output
输出a和b的编辑距离
Sample Input
kitten
sitting
Sample Output
3
参考博文:http://blog.youkuaiyun.com/chichoxian/article/details/53944188

理解思路:和之前做过的一道最长子串匹配的的算法(HDU - 1159 )很相似,都是将动态的过程保存到了二维数组中,但是状态

转移方程和数组的初始化条件又不相同,孙威大佬和我讲的原理是:首行和首列之所以初始为0,1,2,3......是因为如果将一个空串转化为你所需要的目标串就只能添加,添加的元素个数为0,1,2,3......还有数组中一个字符的转化来源可以由3个方向来,即f[i][j]可以由f[i-1][j-1]、f[i-1][j]、f[i][j-1]来确定,由此写出状态转移方程f[i][j]=Min(f[i-1][j-1]+tmp,f[i-1][j]+1,f[i][j-1]+1),tmp是一个中间量,如果s1[i]==s2[j]tmp就是0(不用改变),否则tmp就是1(需要改变),现在还不能完全理解,完全理解后再修改博文,下面附上ac代码。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<string>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<map>

using namespace std;

typedef long long ll;
const int maxn=1005;
char s1[maxn],s2[maxn];
int f[maxn][maxn];
int a,b;

int Min(int a,int b,int c){
    return min(a,min(b,c));
}

void dp(){
    for(int i=0;i<=b;i++)f[0][i]=i;
    for(int i=1;i<=a;i++)f[i][0]=i;
    int tmp;

    for(int i=1;i<=a;i++){
        for(int j=1;j<=b;j++){
            tmp=s1[i-1]==s2[j-1]?0:1;
            f[i][j]=Min(f[i-1][j-1]+tmp,f[i-1][j]+1,f[i][j-1]+1);

        }
    }
}
int main(){
    cin>>s1>>s2;
    a=strlen(s1);
    b=strlen(s2);
    dp();
    cout<<f[a][b]<<endl;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水能zai舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值