相似字符串(字符串编辑)最短距离(非递归版本)

第一次写的递归版本: 点击打开链接,速度太慢了,基本case都超时,重新写一个非递归的
/*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
*/

#include <string>
#include <iostream>

class Solution
{
public:
	int minDistance(std::string word1,std::string word2)
	{
		/*return minDistanceHelper(word1.begin(),
								word1.end(),
								word2.begin(),
								word2.end()
				);*/ //recursive version
		//non recursive version
		if(word1.size()==0)
			return word2.size();
		if(word2.size()==0)
			return word1.size();
		int matrix[word1.size()+1][word2.size()+1];
		for(size_t i=0;i<=word1.size();++i)
			matrix[i][0]=i;
		for(size_t i=0;i<=word2.size();++i)
			matrix[0][i]=i;
		for(int i=1;i<=word1.size();++i)
		{
			for(int j=1;j<=word2.size();++j)
			{
				if(word1[i-1]==word2[j-1])
					matrix[i][j]=matrix[i-1][j-1];
				else
				{
					int c1=matrix[i-1][j-1];//replace
					int c2=matrix[i-1][j]; //delete
					int c3=matrix[i][j-1]; //insert
					matrix[i][j]=1+(c1<=c2?(c1<=c3?c1:c3):(c2<=c3?c2:c3));
				}
			}
		}
		return matrix[word1.size()][word2.size()];
	}
private:
	//recursive version with no state
	int minDistanceHelper(std::string::iterator lbegin,
						  std::string::iterator lend,
						  std::string::iterator rbegin,
						  std::string::iterator rend)
	{
		if(lbegin==lend)
			return rend-rbegin; //insert charater
		else if(rbegin==rend)
			return lend-lbegin; //delete charater
		else if(*lbegin==*rbegin)
		{
			return minDistanceHelper(lbegin+1,lend,rbegin+1,rend);
		}
		else
		{
			int c1=1+minDistanceHelper(lbegin+1,lend,rbegin,rend);//delete
			int c2=1+minDistanceHelper(lbegin,lend,rbegin+1,rend);//insert
			int c3=1+minDistanceHelper(lbegin+1,lend,rbegin+1,rend);//replace
			return c1<=c2?(c1<=c3?c1:c3):(c2<=c3?c2:c3);
		}
	}
};


int main(int argc,char* argv[])
{
	std::string one("b");
	std::string two("a");
	Solution s;
	std::cout<<s.minDistance(one,two)<<std::endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值