(演算法設計技巧與分析)LCS
阿新 • • 發佈:2019-02-06
#include<iostream> #include<stack> using namespace std; void LCS(int **,char[],int,char[],int); void LCS_print(int **,stack<char>&,int ,char c[],int); int main() { char c1[]="xyxxzxyzxy"; char c2[]="zxzyyzxxyxxz"; int **c_array; stack<char> print; int i; c_array=new int*[11];; for(i=0;i<11;i++)c_array[i]=new int[13]; for(i=0;i<11;i++)c_array[i][0]=0; for(i=0;i<13;i++)c_array[0][i]=0; LCS(c_array,c1,10,c2,12); LCS_print(c_array,print,10,c1,12); while(!print.empty()) { cout<<print.top(); print.pop(); } return 0; } void LCS(int **group_array,char c1[],int number1,char c2[],int number2) { int i,j; for(i=1;i<number1+1;i++) for(j=1;j<number2+1;j++) if(c1[i-1]==c2[j-1]) group_array[i][j]=group_array[i-1][j-1]+1; else if(group_array[i-1][j]<group_array[i][j-1]) group_array[i][j]=group_array[i][j-1]; else group_array[i][j]=group_array[i-1][j]; cout<<c1<<"和"<<c2<<"最長公共子序列的長度為"<<group_array[number1-1][number2-1]<<endl; } void LCS_print(int **lcs,stack<char>&a,int number1,char c[],int number2) { if(lcs[number1][number2]==0)return; if(lcs[number1-1][number2]==lcs[number1][number2]) LCS_print(lcs,a,number1-1,c,number2); else if(lcs[number1][number2-1]==lcs[number1][number2]) LCS_print(lcs,a,number1,c,number2-1); else {a.push(c[number1-1]);LCS_print(lcs,a,number1-1,c,number2-1);} }