算法之动态规划——编辑距离问题


编辑距离问题

时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交: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。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM