编程之美读书笔记---计算字符串的相似度

来源:互联网 发布:java怎么做界面设计 编辑:程序博客网 时间:2024/05/22 10:51

使用递归实现,但是计算了重复的子问题,所以采用记忆化方法,将子问题的解保存在一个数组里。

#include <iostream>#include <string>#include <algorithm>#include <cstring>using namespace std;int ans[100][100][100][100];int mmin(int a,int b,int c){a=a<b?a:b;a=a<c?a:c;return a;}int caldis(string a,int pabegin,int paend,string b,int pbbegin,int pbend){if(pabegin>paend){if(pbbegin>pbend)return 0;else return ans[pabegin][paend][pbbegin][pbend]=pbend-pbbegin+1;}if(pbbegin>pbend){if(pabegin>paend)return 0;else return ans[pabegin][paend][pbbegin][pbend]=paend-pabegin+1;}if(a[pabegin]==b[pbbegin]){if(ans[pabegin+1][paend][pbbegin+1][pbend]!=-1)return ans[pabegin+1][paend][pbbegin+1][pbend];else return ans[pabegin+1][paend][pbbegin+1][pbend]=caldis(a,pabegin+1,paend,b,pbbegin+1,pbend);}else {int t1;if(ans[pabegin][paend][pbbegin+1][pbend]!=-1)t1=ans[pabegin][paend][pbbegin+1][pbend];else t1=caldis(a,pabegin,paend,b,pbbegin+1,pbend);int t2;if(ans[pabegin+1][paend][pbbegin][pbend]!=-1)t2=ans[pabegin+1][paend][pbbegin][pbend];else t2=caldis(a,pabegin+1,paend,b,pbbegin,pbend);int t3;if(ans[pabegin+1][paend][pbbegin+1][pbend]!=-1)t3=ans[pabegin+1][paend][pbbegin+1][pbend];else t3=caldis(a,pabegin+1,paend,b,pbbegin+1,pbend);return mmin(t1,t2,t3)+1;}}int main(){string s1="xabfa",s2="xafadfa";int len1=s1.size(),len2=s2.size();memset(ans,-1,sizeof(ans));cout<<caldis(s1,0,len1-1,s2,0,len2-1)<<endl;return 0;}