《编程之美》--计算字符串的相似度
2009-07-29 21:31 Iron 阅读(243) 评论(0) 编辑 收藏 举报//解法如下:
#include <iostream>
using namespace std;
//设置存储全局变量,存储中间结果值,这里只是示例,真正的应用中,需要重新制定程序的结构
int subResult[7][2];
//递归方法
int GetSimilarDegree(char* a,int pABegin,int pAEnd, char* b,int pBBegin, int pBEnd)
{
//如果其中一个字符串已经搜索完毕,则把另一个剩余的元素个数全部加到操作步数上
if(pABegin>pAEnd)
{
if(pBBegin>pBEnd)
return 0;
else
return pBEnd - pBBegin + 1;
}
if(pBBegin>pBEnd)
{
if(pABegin>pAEnd)
return 0;
else
return pAEnd - pABegin + 1;
}
if(a[pABegin] == b[pBBegin])
{
//如果第一个字母相等,则达到相等的步数需要如下
return GetSimilarDegree(a,pABegin+1,pAEnd,b,pBBegin+1,pBEnd);
}
else
{
//如果不等,分别求出三种使其相等后的操作次数,取最小的
int operateTime1 = GetSimilarDegree(a,pABegin+1,pAEnd,b,pBBegin,pBEnd);
int operateTime2 = GetSimilarDegree(a,pABegin,pAEnd,b,pBBegin+1,pBEnd);
int operateTime3 = GetSimilarDegree(a,pABegin+1,pAEnd,b,pBBegin+1,pBEnd);
return 1 + min(operateTime3,min(operateTime1,operateTime2));
}
}
//使用记录子运算结果方法
int GetSimilarDegreeAdvanced(char* a,int pABegin,int pAEnd, char* b,int pBBegin, int pBEnd)
{
int result;
//如果已经计算过此项,则直接提取数据
if(subResult[pABegin][pBBegin] != -1)
{
cout << "产生一次重复" << endl;
return subResult[pABegin][pBBegin];
}
//如果其中一个字符串已经搜索完毕,则把另一个剩余的元素个数全部加到操作步数上
if(pABegin>pAEnd)
{
if(pBBegin>pBEnd)
{
subResult[pABegin][pBBegin] = 0;
return 0;
}
else
{
result = pBEnd - pBBegin + 1;
subResult[pABegin][pBBegin] = result;
return result;
}
}
if(pBBegin>pBEnd)
{
if(pABegin>pAEnd)
{
subResult[pABegin][pBBegin] = 0;
return 0;
}
else
{
result = pAEnd - pABegin + 1;
subResult[pABegin][pBBegin] = result;
return result;
}
}
if(a[pABegin] == b[pBBegin])
{
//如果第一个字母相等,则达到相等的步数需要如下
result = GetSimilarDegreeAdvanced(a,pABegin+1,pAEnd,b,pBBegin+1,pBEnd);
subResult[pABegin][pBBegin] = result;
return result;
}
else
{
//如果不等,分别求出三种使其相等后的操作次数,取最小的
int operateTime1 = GetSimilarDegreeAdvanced(a,pABegin+1,pAEnd,b,pBBegin,pBEnd);
int operateTime2 = GetSimilarDegreeAdvanced(a,pABegin,pAEnd,b,pBBegin+1,pBEnd);
int operateTime3 = GetSimilarDegreeAdvanced(a,pABegin+1,pAEnd,b,pBBegin+1,pBEnd);
result = 1 + min( operateTime3 , min( operateTime1 , operateTime2 ) );
subResult[pABegin][pBBegin] = result;
return result;
}
}
int main()
{
for(int i = 0; i < 7; i++)
for(int j = 0; j < 2; j++)
subResult[i][j] = -1;
cout << "使用递归计算:" << GetSimilarDegree("saddffff",0,7,"add",0,2) << endl;
cout << "-------------------------------------------------------------------" << endl;
cout << "使用记录子运算结果递归计算:" << GetSimilarDegreeAdvanced("saddffff",0,7,"add",0,2) << endl;
cout << "-------------------------------------------------------------------" << endl;
cout << "数组结构" << endl;
for(int i = 0; i < 7; i++)
{
for(int j = 0; j < 2; j++)
{
cout << subResult[i][j] << " ";
}
cout << endl;
}
return 1;
}