描述
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列 X={x1,x2,…,xm},则另一序列 Z={z1,z2,…,zk},X 的子序列是指存在一个严格递增下标序列 {i1,i2,…,ik},使得对于所有 j=1,2,…,k ,有 zj=xij 。
给出两个字符序列 X 和 Y ,求出它们的最长公共子序列。
输入描述
第一行为测试用例的个数 T,接下来有 T 个测试用例。
每个测试样例的第一行是字符串 X ,第二行是字符串 Y。X 和 Y 只包含大写字母,且长度不大于 1000 。
输出描述
对应每个测试样例输出一行,只有一个整数,表示字符串 X 和字符串 Y 的最长公共子序列的长度。
用例输入 1
2 ABCDE ACE AAABBBCCC AABBCC
用例输出 1
3 6
#include<iostream>
#include<memory.h>
#include<cstring>
using namespace std;
#define INF 0x3f3f3f3f
char a[1010];
char b[1010];
int s[1010][1010];
void init(){ //初始化,但Runtime Error了
for(int i=0;i<sizeof(s);i++){
for(int j=0;j<sizeof(s);j++){
s[i][j]=0;
}
}
}
int main()
{
int T;
while(scanf("%d",&T)==1){
while(T--){
while(scanf("%s",a)==1){
scanf("%s",b);
//init();//初始化
memset(s,0,sizeof(s));//比for循环快
int p=strlen(a),q=strlen(b); //计算字符串长度
for(int i=1;i<=p;i++){
for(int j=1;j<=q;j++){
if(a[i-1]==b[j-1]){ // a[]和b[]可以同时出现在最长公共子序列中
s[i][j]=s[i-1][j-1]+1; //在前一个子问题的最长公共子序列长度基础上加 1
}else{
s[i][j]=max(s[i-1][j],s[i][j-1]); //不能同时出现在最长公共子序列中时,最长公共子序列的长度等于不考虑当前字符时的最长公共子序列的长度
}
}
}
cout<<s[p][q]<<endl;
}
}
}
return 0;
}