最长公共子串 NYOJ 36
http://acm.nyist.net/JudgeOnline/problem.php?pid=36
最长公共子序列
时间限制: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 #include<stdlib.h> 3 #include<string.h> 4 int f[1010][1010];//DP数组 5 int b[1010][1010];//记录方向 6 int n,m;//字符串的长 7 void lcs(char x[],char y[],int m,int n) 8 { 9 int i,j; 10 for(i=0;i<=m;i++) 11 f[i][0]=0; 12 for(j=0;j<=n;j++) 13 f[0][j]=0; 14 for(i=1;i<=m;i++) 15 { 16 for(j=1;j<=n;j++) 17 { 18 if(x[i-1]==y[j-1]) 19 { 20 f[i][j]=f[i-1][j-1]+1; 21 b[i][j]=0;//左上 22 } 23 else if(f[i-1][j]>=f[i][j-1]) 24 { 25 f[i][j]=f[i-1][j]; 26 b[i][j]=1;//上 27 } 28 else 29 { 30 f[i][j]=f[i][j-1]; 31 b[i][j]=-1;//左 32 } 33 } 34 } 35 } 36 void printlcs(char x[],int i,int j) 37 { 38 if(i==0||j==0) 39 return; 40 if(b[i][j]==0) 41 { 42 printlcs(x,i-1,j-1); 43 printf("%c",x[i-1]); 44 } 45 else if(b[i][j]==1) 46 { 47 printlcs(x,i-1,j); 48 } 49 else 50 printlcs(x,i,j-1); 51 } 52 int main() 53 { 54 int t,i; 55 char x[1001],y[1001]; 56 scanf("%d",&t); 57 while(t--) 58 { 59 scanf("%s %s",x,y); 60 int m=strlen(x),n=strlen(y); 61 lcs(x,y,m,n); 62 printf("最长公共子串是:\n"); 63 printlcs(x,m,n); 64 printf("\n长度是:\n"); 65 printf("%d\n",f[m][n]); 66 } 67 system("pause"); 68 return 0; 69 }