南邮 OJ 1224 编辑距离问题

来源:互联网 发布:java获取客户端的ip 编辑:程序博客网 时间:2024/06/06 03:31

编辑距离问题

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 174            测试通过 : 42 

比赛描述

        设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

提示

undefined

题目来源

算法设计与实验题解



/*dp[i][j]表示str1的前i个字符和str2的前j个字符之间的编辑距离1.d(s1,"")=d("",s1)=s1.length();d(“ch1”,”ch2”) = (ch1==ch2?0:1);2.d(s1+ch1,s2+ch2) = min( d(s1,s2)+(ch1==ch2 ?0:1),d(s1+ch1,s2),d(s1,s2+ch2) );dp[i][j] = min_val(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+cost);dp[i-1][j]+1:删除str1[i];dp[i][j-1]+1:在str1[i]后面插入str2[j];  dp[i-1][j-1]+cost:将str1[i]改为str2[j].*/#include<iostream>#include<string>using namespace std;int min_val(const int a,const int b,const int c){int min = a<b?a:b;min = min<c?min:c;return min;}int edit_distance(const string &str1,const string &str2){int m=(int)str1.length(),n=(int)str2.length(),i,j,cost;if(m==0){return n;}if(n==0){return m;}int **dp=(int **)malloc((m+1)*sizeof(int*));for(i=0;i<=m;++i){dp[i]=(int *)malloc((n+1)*sizeof(int));}for(i=0;i<=m;++i){dp[i][0] = i;}for(j=1;j<=n;++j){dp[0][j] = j;}for(i=1;i<=m;++i){for(j=1;j<=n;++j){cost = (str1[i-1]==str2[j-1]?0:1);dp[i][j] = min_val(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+cost);}}cost = dp[m][n];for(i=0;i<=m;++i){delete dp[i];}delete dp;return cost;}int main(){string str1,str2;cin>>str1>>str2;cout<<edit_distance(str1,str2)<<endl;}






0 0
原创粉丝点击