最长公共子序列
时间限制:3000 ms | 内存限制:65535 KB
难度:3
- 描述
- 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列。
tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。
- 输入
- 第一行给出一个整数N(0<N<100)表示待测数据组数
接下来每组数据两行,分别为待测的两组字符串。每个字符串长度不大于1000. - 输出
- 每组测试数据输出一个整数,表示最长公共子序列长度。每组结果占一行。
- 样例输入
-
2 asdf adfsd 123abc abc123abc
- 样例输出
-
3 6
类似于苹果那道题;
代码1 #include<stdio.h> 2 3 #include<string.h> 4 5 int max[1001][1001]; 6 7 int main() 8 9 { 10 int n,xlen,ylen,i,j; 11 12 char x[1000]; 13 14 char y[1000]; 15 16 scanf("%d",&n); 17 18 getchar(); 19 20 while(n--) 21 22 { 23 24 gets(x);gets(y); 25 26 xlen=strlen(x); 27 28 ylen=strlen(y); 29 30 for(i=0;i<xlen;i++) 31 32 for(j=0;j<ylen;j++) 33 34 max[i][j]=0;//初始化数组重置为0 35 36 for(i=0;i<xlen;i++) 37 38 for(j=0;j<ylen;j++) 39 40 { 41 42 if(x[i]==y[j]) //当出现两个字符串中有相同的字符时,开始计算 43 44 max[i+1][j+1]=max[i][j]+1;//出现一个时,最大的加上一个,类似于,苹果那道题; 45 46 else if(max[i+1][j]>max[i][j+1]) 47 48 max[i+1][j+1]=max[i+1][j]; 49 50 else max[i+1][j+1]=max[i][j+1]; 51 52 } 53 54 printf("%d ",max[xlen][ylen]); 55 56 } 57 58 return 0 59 60 }