代码改变世界

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

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;
}