Edit Distance--LeetCode

题目:

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:

a) Insert a character
b) Delete a character
c) Replace a character

这也是一个典型的DP问题,我们同样需要一个记录变量,dp[i][j],记录包括word1[i]在内的字符串和包括word2[j+1]
在内的字符串的编辑距离,
那么如果word1[i+1] == word2[j+1] dp[i+1][j+1] = dp[i][j],否则  dp[i+1][j+1] = dp[i][j]+1,
不过也有可能dp[i+1][j+1] = dp[i+1][j]+1 或者dp[i][j+1]+1
实际上 dp[i+1][j+1]应该是三种情况的最小值

我们来分析下为什么是这三种情况中的最小值。这个题目是编程之美中的题目,我借用编程之美中的解释来说明一下,考虑如何才能把这个问题转化成规模较小的同样的问题。如果有两个串A=xabcdae和B=xfdfa,他们的第一个字符是相同的,只要计算A【2....7】和B[2....5]的距离就可以了。但是如果两个串的第一个字符不相同。那么可以通过如下的操作(lenA和lenB分别是A串和B串的长度)

     1、删除A串的第一个字符,然后计算A[2....lenA]和B[1,,,,,,lenB]的距离

     2、删除B串的第一个字符,然后计算A[1....lenA]和B[2,,,,,,lenB]的距离

    3、修改A串的第一个字符为B串的第一个字符,然后计算A[2....lenA]和B[2,,,,,,lenB]的距离

   4、修改B串的第一个字符为A串的第一个字符,然后计算A[2....lenA]和B[2,,,,,,lenB]的距离

   5、增加B串的第一个字符到A串的第一个字符之前,然后计算A[1....lenA]和B[2,,,,,,lenB]的距离

   6、增加A串的第一个字符到B串的第一个字符之前,然后计算A[2....lenA]和B[1,,,,,,lenB]的距离

#include <iostream>
#include <vector>
#include <string>
#include <limits>
using namespace std;
 
int Edit_distance(string& s1,string& s2)
{
	vector<vector<int> > dp(s1.size());
	int i,j;	
	for(i=0;i<dp.size();i++)
		dp[i].assign(s2.size(),numeric_limits<int>::max());
	if(s1[0]==s2[0])
		dp[0][0] =0;
	else
		dp[0][0] =1;
	for(i=1;i<dp[0].size();i++)
		if(s1[0] == s2[i])
			dp[0][i] = i;
		else
			dp[0][i] = dp[0][i-1]+1;
	for(i=1;i<dp.size();i++)
		if(s1[i] == s2[0])
			dp[i][0] = i;
		else
			dp[i][0] = dp[i-1][0]+1;
 
	for(i=1;i<dp.size();i++)
	{
		for(j=1;j<dp[0].size();j++)
			{
				if(s1[i] == s2[j])
					dp[i][j] = dp[i-1][j-1];
				else
					dp[i][j] = min(dp[i-1][j-1]+1,min(dp[i][j-1]+1,dp[i-1][j]+1));
 
			}
	}
	
	return dp[s1.size()-1][s2.size()-1];
}
int main() 
{
	string s1("abcd");
	string s2("adc");
	cout<<Edit_distance(s1,s2)<<endl;;
	cout<<minDistance(s1,s2)<<endl;
	return 0;
}

不过在申请空间时,也可以多申请一个,比需要的空间大一,DP问题在知道了方程以后,还需要注意的就是初始化。对变量的初始化过程也是非常重要的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值