编辑距离

来源:互联网 发布:78团淘宝兼职是真的吗 编辑:程序博客网 时间:2024/06/05 19:21

编辑距离


Description

字符串是数据结构和计算机语言里很重要的数据类型,在计算机语言中,对于字符串我们有很多的操作定义,因此我们可以对字符串进行很多复杂的运算和操作。实际上,所有复杂的字符串操作都是由字符串的基本操作组成。例如,把子串 a 替换为子串 b,就是用查找、删除和插入这三个基本操作实现的。
因此,在复杂字符串操作的编程中,为了提高程序中字符操作的速度,我们就应该用最少的基本操作完成复杂操作。
在这里,假设字符串的基本操作仅为:删除一个字符、插入一个字符和将一个字符修改成另一个字符这三种操作。
我们把进行了一次上述三种操作的任意一种操作称为进行了一步字符基本操作。
下面我们定义两个字符串的编辑距离:对于两个字符串 ab,通过上述的基本操作,我们可以把 a 变成 bb 变成 a;那么,把字符串 a 变成字符串 b 需要的最少基本字符操作步数称为字符串 a 和字符串 b 的编辑距离。
例如,如 a=ABCb=CBCD,则 ab 的编辑距离为 2
你的任务就是:编一个最快的程序来计算任意两个字符串的编辑距离。


Input

1 行为字符串 a;第 2 行为字符串 b
注:字符串的长度不大于 1000,字符串中的字符全为大写字母。


Output

编辑距离。


Sample Input

ABC
CBCD


Sample Output

2


Solution

fi,j 表示 ai 个字符与 bj 个字符的编辑距离,则
ai1=bj1

fi,j=fi1,j1

ai1bj1
fi,j=MIN{fi1,j,fi,j1,fi1,j1}+1


Code

#include <iostream>#include <cstdio>#include <cstring>#define Min(x,y) ((x)<(y)?(x):(y))using namespace std;char a[1010],b[1010];int f[1010][1010];int main(){    freopen("edit.in","r",stdin);    freopen("edit.out","w",stdout);    scanf("%s%s",a,b);    int la=strlen(a),lb=strlen(b);    for(int i=0;i<la;i++)f[i+1][0]=i+1;    for(int i=0;i<lb;i++)f[0][i+1]=i+1;    for(int i=0;i<la;i++)        for(int j=0;j<lb;j++)            if(a[i]==b[j])                f[i+1][j+1]=f[i][j];            else                f[i+1][j+1]=Min(Min(f[i+1][j]+1,f[i][j+1]+1),f[i][j]+1);    printf("%d\n",f[la][lb]);    return 0;}
0 0
原创粉丝点击