zzulioj 1206 字符串的修改(dp求解 Minimum Edit Distance )

来源:互联网 发布:mac 没内置扬声器选项 编辑:程序博客网 时间:2024/06/04 21:00

Description

设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:

1. 删除一个字符;
2. 插入一个字符;
3. 将一个字符改为另一个字符。
对任给的两个字符串A和B,计算出将字符串A变换为字符串B所用的最少字符操作次数。

Input

第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于200。

Output

只有一个正整数,为最少字符操作次数。

Sample Input

sfdxbqw
gfdgw

Sample Output

4

很明显的动态规划算法,刚开始不知道怎么写,后来上网查了查,是一类题,
叫做Edit Distance。很经典的一类题型,借鉴了两个大牛的博客,写的非常详细:

http://blog.csdn.net/huaweidong2011/article/details/7727482#t1

http://blog.csdn.net/abcjennifer/article/details/7735272

解题过程上面两个博客写的非常清楚,就不再多说了。

#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<vector>#include<cstring>#include<string>#include<map>using namespace std;#define N 220int main(){    int m,n,i,j;    int dp[N][N];    char a[N],b[N];    while(~scanf("%s%s",a,b))    {        m=strlen(a);        n=strlen(b);        memset(dp,0,sizeof(dp));        for(i=0; i<=m; i++)            dp[i][0]=i;        for(j=0; j<=n; j++)            dp[0][j]=j;        for(j=1; j<=n; j++)            for(i=1; i<=m; i++)            {                if(a[i-1]==b[j-1])                    dp[i][j]=dp[i-1][j-1];                else                    dp[i][j]=min(min(dp[i-1][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+1);            }        printf("%d\n",dp[m][n]);    }    return 0;}


0 0
原创粉丝点击