给出两个字符串,求出这样的一个最长的公共子序列的长度:子序列中的每个字符都能在两个原串中找到,而且每个字符的先后顺序和原串中的先后顺序一致。
Sample Input
abcfbc abfcab
programming contest
abcd mnp
Sample Output
4
2
0
#include <iostream>
#include<cstring>
#define NUM 1001
using namespace std;
char A[NUM];
char B[NUM];
int result[NUM][NUM];
//递归方法
int Maxlen(int n,int m)
{
if(n<0||m<0)
return 0;
if(n==0&&m==0&&A[0]==B[0])
return 1;
//各种边界条件的计算;
if(n==0&&m==0)
return 0;
if(result[n][m]> 0)
return result[n][m];
if(A[n]==B[m]){
result[n][m]= Maxlen(n-1, m-1)+1;//如果上下相等;;就将个数加1;
}
else{
int y = Maxlen(n-1, m);//如果,上下不相等,就将上或者是下移动一个,移动以后如果有相等的就将相等的个数数出来,
int z = Maxlen(n, m-1);//观察两个的个数哪一个大,用那一个;
result[n][m] = max(y, z);
}
return result[n][m];
}
int main2()
{
int N = 0,M = 0;
while(cin>>A>>B){
N = (int)strlen(A);
M = (int)strlen(B);
for(int i = 0;i<NUM;i++){
for(int j = 0;j<NUM;j++)
result[i][j] = -1;
}//储存结果数组;
cout <<Maxlen(N-1, M-1)<<endl;
for(int i = 0;i<NUM;i++){
for(int j = 0;j<M;j++)
cout <<result[i][j]<<" ";
cout <<endl;
}
}
return 0;
}
//递推方法
int main()
{
char a[100];
char b[100];
int result[2][100];//表示计算到我这儿的时候最大的子序列是多少;;;
int N;
cin>>N;
cin>>a>>b;
while(N--){
int n = (int)strlen(a);
int m = (int)strlen(b);
result[1][0] = 0;
for( int j = 0;j <= m; j ++ )
result[0][j] = 0;
//初始化;;;;很重要;;;;
for( int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
if(a[i-1] == b[j-1]){//做判断;;
result[i%2][j] = result[(i-1)%2][j-1]+1;
}
else{
result[i%2][j] = max(result[(i-1)%2][j],result[i%2][j-1]);
}
}
// for(int i = 0;i<=1;i++){
// for(int j = 0;j<=m;j++)
// cout <<result[i][j]<<" ";
// cout <<endl;
// }//测试
}
cout<<result[1][m]<<endl;
}
return 0;
}