算法导论第十五章习题15.4-4c++代码实现
2012-08-10 15:50
393 查看
只用两行表c就能实现计算LCS长度的算法。因为在计算长度的时候c[i][j]只需要上一行以及本行的计数就能计算出结果,所以我们只用两行表c来实现。每当第二行的长度计算完成之后,便将第二行的长度赋给第一行,而第二行清0,这样计算下一行的时候,第一行就能使用上一层循环中的长度。代码如下:
但是该代码中仍然多了几个不必要的循环,从而增加了时间复杂度,下面对改代码进行简化:
#include<iostream> #include<string> using namespace std; int LCS_Length(string x,string y) { int m,n,i,j,k; m=x.length(); n=y.length(); //使y永远为最小的,n为最短的 if(m<=n) { string temp; temp=x; x=y; y=temp; i=m; m=n; n=i; } int c[2][100]={0}; for(i=1;i<=n;i++) { c[0][i]=0; } c[1][0]=0; for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { if(x[i-1]==y[j-1]) { c[1][j]=c[0][j-1]+1; } else if(c[0][j]>=c[1][j-1]) { c[1][j]=c[0][j]; } else { c[1][j]=c[1][j-1]; } } //将第二行的结果放到第一行中,而第二行赋值为0 for(k=1;k<=n;k++) { c[0][k]=c[1][k]; c[1][k]=0; } } return c[0] ; } int main() { string x="abcbdab"; string y="bdcaba"; cout<<LCS_Length(x,y)<<endl; return 0; }
但是该代码中仍然多了几个不必要的循环,从而增加了时间复杂度,下面对改代码进行简化:
#include<iostream> #include<string> using namespace std; int LCS_LengthC(string x,string y) { int m,n,i,j; bool flag=0; m=x.length(); n=y.length(); //使y永远为最小的,n为最短的 if(m<=n) { string temp; temp=x; x=y; y=temp; i=m; m=n; n=i; } int c[2][10]={0}; c[1][0]=0; for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { if(x[i-1]==y[j-1]) { c[(int)!flag][j]=c[(int)flag][j-1]+1; } else if(c[(int)flag][j]>=c[(int)!flag][j-1]) { c[(int)!flag][j]=c[(int)flag][j]; } else { c[(int)!flag][j]=c[(int)!flag][j-1]; } } flag=!flag; for(int k=1;k<=n;k++) { c[(int)!flag][k]=0; } } return c[(int)flag] ; } int main() { string x="abcbdab"; string y="bdcaba"; cout<<LCS_LengthC(x,y)<<endl; return 0; }
相关文章推荐
- 算法导论第十五章习题15.1-1c++代码实现
- 算法导论第十五章动态规划--工厂装配线c++代码实现
- 算法导论第十三章习题13-3——AVL树(高度平衡树)C++代码详细实现
- 算法导论第十五章习题15.4-5
- 算法导论第十三章--红黑树C++代码实现
- 算法导论习题6.2代码实现
- 算法导论第二章课后习题代码实现
- 算法导论例题及课后习题代码实现——第六章
- 《算法导论》第二章----插入排序(伪代码实现、课后习题(递归版本、二分查找策略版本))
- 算法导论第十五章---最长公共子串LCS代码实现
- 算法导论 第15章 动态规划 习题C++实现
- 算法导论 红黑树的C++代码实现
- 算法导论第十二章——二叉查找树的C++代码实现
- 算法导论第十五章-动态规划-Cpp代码实现
- 算法导论第12章-搜索二叉树伪代码的C++程序全实现
- 算法导论三习题2.1-4代码实现
- 算法导论第十五章习题15.4-2
- 归并排序-c++代码实现及运行实例结果
- 【代码】C++实现广义表及其测试用例
- 创建堆,堆排序的详细实现过程,C++完整代码