首页 > 代码库 > 编程之美——计算字符串相似度
编程之美——计算字符串相似度
方法一:使用递归思想
代码:
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 int minValue(int t1,int t2,int t3); 6 int calculateStringDistance(string strA,int pAbegin,int pAend,string strB,int pBbegin,int pBend); 7 8 int main() 9 {10 string strA="hello";11 string strB="hi";12 cout<<calculateStringDistance(strA,0,strA.size(),strB,0,strB.size());13 return 0;14 }15 16 int calculateStringDistance(string strA,int pAbegin,int pAend,string strB,int pBbegin,int pBend)17 {18 if(pAbegin>pAend)19 {20 if(pBbegin>pBend)21 return 0;22 else23 return pBend-pBbegin+1;24 }25 if(pBbegin>pBend)26 {27 if(pAbegin>pAend)28 return 0;29 else30 return pAend-pAbegin+1;31 }32 33 if(strA[pAbegin]==strB[pBbegin])34 return calculateStringDistance(strA,pAbegin+1,pAend,strB,pBbegin+1,pBend);35 else36 {37 int t1=calculateStringDistance(strA,pAbegin+1,pAend,strB,pBbegin+1,pBend);38 int t2=calculateStringDistance(strA,pAbegin,pAend,strB,pBbegin+1,pBend);39 int t3=calculateStringDistance(strA,pAbegin+1,pAend,strB,pBbegin,pBend);40 return minValue(t1,t2,t3)+1;41 }42 }43 44 int minValue(int t1,int t2,int t3)45 {46 int t=min(t1,t2);47 return min(t,t3);48 }
上面的递归程序中,有些数据被重复计算了,可以使用一个二维数组存储递归过程中间值,避免不必要的递归过程
方法二:
1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 using namespace std; 5 6 int minValue(int t1,int t2,int t3); 7 int calculateStringDistance(string strA,int pAbegin,int pAend,string strB,int pBbegin,int pBend); 8 9 int momoDistance[100][100];10 11 int main()12 {13 string strA="abcdfef";14 string strB="f";15 memset(momoDistance,0,sizeof(momoDistance));16 17 cout<<calculateStringDistance(strA,0,strA.size()-1,strB,0,strB.size()-1);18 19 return 0;20 }21 22 int calculateStringDistance(string strA,int pAbegin,int pAend,string strB,int pBbegin,int pBend)23 {24 if(pAbegin>pAend)25 {26 if(pBbegin>pBend)27 return 0;28 else29 return pBend-pBbegin+1;30 }31 if(pBbegin>pBend)32 {33 if(pAbegin>pAend)34 return 0;35 else36 return pAend-pAbegin+1;37 }38 39 if(strA[pAbegin]==strB[pBbegin])40 {41 if(momoDistance[pAbegin+1][pBbegin+1]!=0)42 return momoDistance[pAbegin+1][pBbegin+1];43 else44 {45 momoDistance[pAbegin+1][pBbegin+1]=46 calculateStringDistance(strA,pAbegin+1,pAend,strB,pBbegin+1,pBend);47 return momoDistance[pAbegin+1][pBbegin+1];48 }49 }50 else51 {52 int t1,t2,t3;53 if(momoDistance[pAbegin+1][pBbegin+1]!=0)54 t1=momoDistance[pAbegin+1][pBbegin+1];55 else56 {57 t1=calculateStringDistance(strA,pAbegin+1,pAend,strB,pBbegin+1,pBend);58 momoDistance[pAbegin+1][pBbegin+1]=t1;59 }60 61 if(momoDistance[pAbegin+1][pBbegin]!=0)62 t2=momoDistance[pAbegin+1][pBbegin];63 else64 {65 t2=calculateStringDistance(strA,pAbegin+1,pAend,strB,pBbegin,pBend);66 momoDistance[pAbegin+1][pBbegin]=t2;67 }68 69 if(momoDistance[pAbegin][pBbegin+1]!=0)70 t3=momoDistance[pAbegin][pBbegin+1];71 else72 {73 t3=calculateStringDistance(strA,pAbegin,pAend,strB,pBbegin+1,pBend);74 momoDistance[pAbegin][pBbegin+1]=t3;75 }76 77 return minValue(t1,t2,t3)+1;78 }79 }80 81 int minValue(int t1,int t2,int t3)82 {83 int t=min(t1,t2);84 return min(t,t3);85 }
memset函数说明
以字节为单位对指向内存的4个字节赋值,每个都用ASCⅡ为1的字符去填充,转为二进制后,1就00000001,所以用memset对非字符型数组赋初值是不可取的!但是可以当作清零函数;
编程之美——计算字符串相似度
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。