演算法導論第十五章習題15.4-2
阿新 • • 發佈:2019-01-03
不適用陣列b就能實現LCS結果的列印,程式碼如下:
//LCS #include<iostream> #include<string> using namespace std; //改進的LCS演算法,不使用陣列b便可打印出結果 void LCS_LengthC(string x,string y,int (*c)[100]) { int m,n; m=x.length(); n=x.length(); int i,j; //如果i或j等於0則c[i][j]=0; for(i=1;i<=m;i++) { c[i][0]=0; } for(i=1;i<=n;i++) { c[0][i]=0; } //遍歷兩個字串,依次標記c[i][j],c[i][j]標記了從x的開始到第i個元素與從 //y開始到第j個元素中LCS的長度 //陣列b用來標記最長公共子串所要走的路線,該路線為兩個字串組成的矩陣中的對應的字母 for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { if(x[i-1]==y[j-1]) { c[i][j]=c[i-1][j-1]+1; } else { if(c[i][j-1]>c[i-1][j]) { c[i][j]=c[i][j-1]; } else { c[i][j]=c[i-1][j]; } } } } } void PrintAnswerC(string x,string y,int(*c)[100],int i,int j) { if(i==0||j==0) { return ; } else { if(x[i-1]==y[j-1]) { PrintAnswerC(x,y,c,i-1,j-1); cout<<x[i-1]<<" "; } else if(c[i-1][j]>=c[i][j-1]) { PrintAnswerC(x,y,c,i-1,j); } else { PrintAnswerC(x,y,c,i,j-1); } } } int main() { string x="abcbda"; string y="bdcaba"; int c[100][100]={0}; int b[100][100]={0}; LCS_LengthC(x,y,c); cout<<"the LCS is: "<<c[x.length()][y.length()]<<endl; PrintAnswerC(x,y,c,x.length(),y.length()); return 0; }