编程之美之计算字符串的相似度

三种方式实现 递归,备忘录,动态规划
// 编程之美之计算字符串的相似度.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <string>
#include <iostream>
#define N1 8
#define N2 5
using namespace std;
int culdismemo[N1+1][N2+1];//加一就好使了 why?见下面分析
int culdisdynm[N1+1][N2+1];//加一就好使了 why?见下面分析
int minofthree(int a,int b,int c)
{ 
	int min=a;
	if(min>b) min=b;
	if(min>c) min=c;
	return min;
}
int culdis1(char *Arra,int ia,int na,char *Arrb,int ib,int nb)
{
	if(ia<na&&ib<nb)
	{
		if(Arra[ia]==Arrb[ib]) return culdis1(Arra,ia+1,na,Arrb,ib+1,nb);
		else
		{
			int d1,d2,d3;
			d1 = culdis1(Arra,ia+1,na,Arrb,ib+1,nb);
			d2 = culdis1(Arra,ia,na,Arrb,ib+1,nb);
			d3 = culdis1(Arra,ia+1,na,Arrb,ib,nb);
			return minofthree(d1,d2,d3)+1;
		}
	}
	else
	{
		if(ia==na)
			return nb-ib;
		if(ib==nb)
			return na-ia;
	}
}
int culdis2(char *Arra,int ia,int na,char *Arrb,int ib,int nb)
{
	if(culdismemo[ia][ib]!=-100) return culdismemo[ia][ib];
	if(ia<na&&ib<nb)
	{
		if(Arra[ia]==Arrb[ib])
		{
			if(culdismemo[ia+1][ib+1]==-100)//在这部判断的时候已经用到了culdismemo[ia+1][ib+1],然而culdismemo[ia+1][ib+1]确实不存在,是不确定的值,
			culdismemo[ia+1][ib+1] = culdis2(Arra,ia+1,na,Arrb,ib+1,nb);//这部调用culdis2并不会把结果给culdismemo[ia+1][ib+1]。因为它不存在。
			//也就是说函数在执行culdis(N1-1,N1,N2-1,N2)时确实用了culdismemo[N1][N2]作为判断,然而其不存在。但是函数在调用culdis(N1,N2)时并没有用到culdismemo[N1][N2],因为是在第一个else里
			//所以culdis必须用多余一个的长度。而多余的一个长度并没有浪费,把结果存到里面,减少了函数调用的次数。
			//cout<<ia+1<<" "<<ib+1<<" "<<culdismemo[ia+1][ib+1]<<" "<<endl;
			culdismemo[ia][ib] = culdismemo[ia+1][ib+1];
		}
		else
		{
			if(culdismemo[ia+1][ib+1]==-100)
			culdismemo[ia+1][ib+1] = culdis2(Arra,ia+1,na,Arrb,ib+1,nb);
			if(culdismemo[ia][ib+1]==-100)
			culdismemo[ia][ib+1] = culdis2(Arra,ia,na,Arrb,ib+1,nb);
			if(culdismemo[ia+1][ib]==-100)
			culdismemo[ia+1][ib] = culdis2(Arra,ia+1,na,Arrb,ib,nb);
			//cout<<ia+1<<" "<<ib+1<<" "<<culdismemo[ia+1][ib+1]<<" "<<endl;
			//cout<<ia<<" "<<ib+1<<" "<<culdismemo[ia][ib+1]<<" "<<endl;
			//cout<<ia+1<<" "<<ib<<" "<<culdismemo[ia+1][ib]<<" "<<endl;
			culdismemo[ia][ib] = minofthree(culdismemo[ia+1][ib+1],culdismemo[ia][ib+1],culdismemo[ia+1][ib])+1;
		}
		return culdismemo[ia][ib];
	}
	else
	{
		if(ia==na)
			return nb-ib;
		if(ib==nb)
			return na-ia;
	}
}
int culdis3(char *Arra,int na,char *Arrb,int nb)
{
	for(int i=na;i>=0;i--)//initiate
		culdisdynm[i][nb]=na-i;
	for(int i=nb;i>=0;i--)
		culdisdynm[na][i]=nb-i;
	for(int i=na-1;i>=0;i--)
		for(int j=nb-1;j>=0;j--)
		{
			if(Arra[i]==Arrb[j])
				culdisdynm[i][j]=culdisdynm[i+1][j+1];
			else
				culdisdynm[i][j] = minofthree(culdisdynm[i+1][j+1],culdisdynm[i][j+1],culdisdynm[i+1][j])+1;
		}
	return culdisdynm[0][0];
}
int _tmain(int argc, _TCHAR* argv[])
{
	char *cha,*chb;
	cha = new char[N1];
	chb = new char[N2];
	cha="aaabcdefaaa";chb="ajkla";
	//string stra="aabcd",strb="abcd";
	for(int i=0;i<=N1;i++)//为什么N1,N2,见上面分析
	{
		for(int j=0;j<=N2;j++)
		culdismemo[i][j]=-100;
	}
	cout<<" 1distance is "<<culdis1(cha,0,N1,chb,0,N2)<<endl;
	cout<<" 2distance is "<<culdis2(cha,0,N1,chb,0,N2)<<endl;
	cout<<" 3distance is "<<culdis3(cha,N1,chb,N2)<<endl;
	system("pause");
	return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值