编辑距离问题
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:60 测试通过:19
总提交:60 测试通过:19
描述
设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括
(1)删除一个字符;(2)插入一个字符;(3)将一个字符改为另一个字符。
将字符串A变换为字符串B所用的最少字符操作数称为字符串A到B的编辑距离,记为d(A,B)。试设计一个有效算法,对任给的2个字符串A和B,计算出它们的编辑距离d(A,B)。
对于给定的字符串A和字符串B,编程计算其编辑距离d(A,B)。
输入
输入数的第一行是字符串A,文件的第二行是字符串B。
输出
输出编辑距离d(A,B)的第1行中。
样例输入
fxpimu
xwrs
样例输出
5
题目来源
算法设计与实验题解
题目来源(http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1224)
对于此题,使用动态规划算法是很容易得出最优值的,首先使用二维数组m[i][j]储存由字符串s[1, i]与t[1, j]编辑的最短距离,这样的话,很容易得出递归式:
具体代码如下:
1 int edictlen(char *s, char *t) 2 { 3 int len1=strlen(s); 4 int len2=strlen(t); 5 int i,j; 6 int **m=new int *[len1+2]; 7 for(i=0; i<=len1; i++) 8 m[i]=new int [len2]; 9 m[0][0]=0; 10 for(i=1; i<len1; i++) m[i][0]=i; 11 for(i=1; i<len2; i++) m[0][i]=i; 12 for(i=1; i<len1; i++) 13 { 14 for(j=1; j<len2; j++) 15 { 16 if(s[i]==t[j]) m[i][j]=m[i-1][j-1]; 17 else m[i][j]=min(m[i-1][j-1],m[i-1][j],m[i][j-1])+1; 18 } 19 } 20 int temp=m[len1-1][len2-1]; 21 22 for (i=0;i<=len1;i++) 23 { 24 delete[] m[i]; 25 } 26 delete[] m; 27 return temp; 28 }
注意,字符串是从1开始算起,使用数组输入时也需要从1开始。还有min函数就是三个数中取最小值。
本代码经测试已经AC。