动态规划-编辑距离问题

一、问题描述

设A和B是两个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括:

  (1)删除一个字符;

  (2)插入一个字符;

  (3)将一个字符改为另一个字符;

  将字符串A变换为字符串B所用的最少字符操作数称为字符串A到B的编辑距离,记为d(A,B)。试设计一个有效算法,对任给的两个字符串A和B,计算出它们的编辑距离d(A,B)。

#include <iostream>
#include <algorithm>
const int MAXLEN =100;
#define  Match 1
#define Insert 2
#define Delete 3

class EditDistance
{
	typedef struct Cell
	{
		int cost;
		int parant;
	}cell_t;
public:
	EditDistance()
	{
		memset(m,0,sizeof(int)*MAXLEN*MAXLEN);
		for(int i=1;i!=MAXLEN;i++){

			m[i][0].cost=i;
			m[i][0].parant=Insert;
			m[0][i].cost=i;
			m[0][i].parant=Insert;
		}
		m[0][0].parant=-1;
	}

	//m[i][j]=min{m[i-1][j-1]+match(s[i],[j]),m[i][j-1]+1,m[i-1][j]+1}
	int excute(char* s,char* t)
	{
		int opt[4];
		int len_s=strlen(s);
		int len_t=strlen(t);
		for(int i=1;i!=len_s;i++){
			for(int  j=1;j!=len_t;j++){
				opt[Match]=m[i-1][j-1].cost+match(s[i],t[j]);
				opt[Insert]=m[i][j-1].cost+1;
				opt[Delete]=m[i-1][j].cost+1;
				m[i][j].cost=std::min(std::min(opt[Match],opt[Insert]),opt[Delete]);
			}
		}
		return m[len_s-1][len_t-1].cost;

	}
	~EditDistance()
	{
	}
private:
	int match(char i,char j)
	{
		if(i==j){
			return 0;
		}
		return 1;
	}
	cell_t m[MAXLEN][MAXLEN];
};

int main()
{
	char s[]="asdffd";
	char t[]="aedfad";
	EditDistance distance;
	int res=distance.excute(s,t);
	std::cout<<res<<std::endl;
	getchar();
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值