#include<iostream>
using namespace std;
int L[20][20],S[20][20]; // 假设最多不超过19个元素比较
int CommonOrder(char x[],int m,char y[],int n,char z[])
{
int i,j,k;
for(j=0;j<=n;j++) L[0][j] = 0; // 初始化第0行(可省略)
for(i=0;i<=m;i++) L[i][0] = 0; // 初始化第0列(可省略)
for(i=1;i<=m;i++) // x数组1-m
for(j=1;j<=n;j++) // y数组1-n
// 两个元素相等
if(x[i]==y[j]){
L[i][j] = L[i-1][j-1]+1; //最长公共子序列长度lCS矩阵
S[i][j] = 1; // 状态矩阵置1
}
// 两个元素不等
// 长度矩阵左边的值 ≥ 矩阵上边的值
else if(L[i][j-1]>=L[i-1][j]){
L[i][j] = L[i][j-1]; // 取左边
S[i][j] = 2; // 状态置2
}
// 长度矩阵左边的值 < 矩阵上边的值
else{
L[i][j] = L[i-1][j]; // 取上边
S[i][j] = 3; // 状态置3
}
i=m;j=n; // 从矩阵右下角开始搜寻
k = L[m][n]; // 最长公共子序列的长度 k为长度矩阵右下角的值 L[m][n]
while(i>0 && j>0){
// 两元素相等,取该元素,向左上角继续搜寻
if(S[i][j]==1){
z[k] = x[i];
k--;i--;j--;
}
// 两元素不等
// 状态为 2,向左边继续搜寻
else if(S[i][j]==2) j--;
// 状态为 3,向上边继续搜寻
else i--;
}
for(k=1;k<=L[m][n];k++) // 输出最长公共子序列
cout<<z[k]<<" ";
cout<<endl;
return L[m][n]; // 返回公共子序列长度
}
int main()
{
char x[7] = {' ','a','b','c','b','d','b'};
char y[10] = {' ','a','c','b','b','a','b','d','b','b'};
char z[10] = {};
cout<<CommonOrder(x,6,y,9,z)<<endl; // 两个参数是参与比较的元素个数
return 0;
}