POJ3356解题报告(最小编辑距离)

本文深入探讨了最小编辑距离的概念及其在字符串匹配中的应用,并提供了详细算法解释及C++代码实现。通过逐步解析算法逻辑,展示了如何计算两个字符串之间的最小操作次数,包括插入、删除和替换。
给定两个字符串x,y,求得相互之间转换的最小操作次数(最小编辑距离)。dp[i][j]表示x的前i个字符和y的前j个字符的最小编辑距离,与以下三个值有关:
  1. dp[i-1][j]
  2. dp[i - 1][j - 1]
  3. dp[i][j - 1]
对于第一个,要求的dp[i][j],要做的是比较x[i]和空(可能是insertion或者deletion,不关注),操作代价为1。对于dp[i][j - 1]同样是如此。但是,对于dp[i - 1][j - 1]而言,就要考察x[i]和y[j]是否相等,如果相等,则dp[i][j] = dp[i - 1][j - 1],否则,dp[i][j] = dp[i - 1][j - 1] + 1。综上,得到递归表达形式如下:
dp[i][j]=min( dp[i - 1][j - 1] , dp[i][j - 1] + 1, dp[i - 1][j] + 1) 当x[i] == y[j]
dp[i][j]=min( dp[i - 1][j - 1]  + 1, dp[i][j - 1] + 1, dp[i - 1][j] + 1) 当x[i] != y[j]
代码如下,注意多测试用例,我wa了一次,就是因为这个:

#include 
#include 
#include 
using namespace std;

char x[1001], y[1001];
int xl, yl;
short int dp[1001][1001];
int threeMin(int i, int j, int k) {
	return min(min(i, j), k);
}
int main() {
	while (cin >> xl >> x >> yl >> y) {
		memset(dp, 0, sizeof(dp));
			for (int i = 1; i <= xl; ++i)
				dp[i][0] = dp[i - 1][0] + 1;
			for (int i = 1; i <= yl; ++i)
				dp[0][i] = dp[0][i - 1] + 1;
			for (int i = 1; i <= xl; ++i)
				for (int j = 1; j <= yl; ++j) {
					if (x[i - 1] == y[j - 1])
						dp[i][j] = threeMin(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1]);
					else
						dp[i][j] = threeMin(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1);
				}
			cout << dp[xl][yl] << endl;
	}
	return 0;
}

转载于:https://www.cnblogs.com/sing1ee/archive/2012/02/02/2765005.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值