三种方式实现 递归,备忘录,动态规划
// 编程之美之计算字符串的相似度.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;
}