wustoj1889编辑距离

来源:互联网 发布:手机淘宝我的店铺在哪 编辑:程序博客网 时间:2024/05/29 18:50

Description

设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:
1、删除一个字符;
2、插入一个字符;
3、将一个字符改为另一个字符。
对任的两个字符串A和B,计算出将字符串A变换为字符串B所用的最少字符操作次数。

Input

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

Output

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

Sample Input 

sfdqxbw
gfdgw

Sample Output

4

分析:字符串a通过增删改三种方式变为b,用dp[i][j]表示a的前i个字符变成b的前j个字符需要的次数。很显然的背包问题,如果a的第i个字符和b的第j个字符相等的话,不做修改dp[i][j] = dp[i-1][j-1],反之,dp[i][j] = min( min(dp[i-1][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+1)。
参考代码:
#include<cstdio>#include<cmath>#include<cstdlib>#include<cstring>#include<string>#include<algorithm>#include<stack>#include<queue>#include<map>#include<vector>#include<iostream>using namespace std;const int maxn = 200+10;char a[maxn];char b[maxn];int dp[maxn][maxn];int main(){    while( ~scanf("%s%s",a,b))    {        int lena = strlen(a);        int lenb = strlen(b);        memset(dp,0,sizeof(dp));        //b为空串  删除前i个字符        for( int i = 1; i <= lena; i++)            dp[i][0] = i;        //a为空串  添加前i个字符        for( int i = 1; i <= lenb; i++)            dp[0][i] = i;        for( int i = 1; i <= lena; i++)        {            for( int j = 1; j <= lenb; j++)            {                if( a[i-1] == b[j-1])//相等的话不做改变                    dp[i][j] = dp[i-1][j-1];                else//不相等 删减a 或删减b 或改a[i]到b[i]                    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[lena][lenb]);    }    return 0;}


0 0
原创粉丝点击