算法导论第十五章习题15.4-4c++代码实现

来源:互联网 发布:东营区一中知校二维码 编辑:程序博客网 时间:2024/04/30 03:42

只用两行表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];}}//将第二行的结果放到第一行中,而第二行赋值为0for(k=1;k<=n;k++){c[0][k]=c[1][k];c[1][k]=0;}}return c[0][n];}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][n];}int main(){string x="abcbdab";string y="bdcaba";cout<<LCS_LengthC(x,y)<<endl;return 0;}