南邮 OJ 1224 编辑距离问题

编辑距离问题

时间限制(普通/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;
}






你可能感兴趣的:(ACM,南邮OJ,编辑距离问题)