1.给出两个字符串A B,求A与B的最长公共子序列的长度(子序列不要求是连续的)。
2.给出两个字符串A B,求A与B的最长公共子序列子串(子序列不要求是连续的)。
比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
最大长度为4,一个是求长度,一个是要求最长子串
第2行:字符串B
(A,B的长度 <= 1000)
abcicba abdkscab
abca
求长度图解过程:
循环过程图解如下:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
0 | 1 | 2 | 2 | 2 | 2 | 2 | 2 |
0 | 1 | 2 | 3 | 3 | 3 | 3 | 3 |
0 | 1 | 2 | 3 | 3 | 4 | 4 | 4 |
0 | 1 | 2 | 3 | 4 | 4 | 4 | 4 |
0 | 1 | 2 | 3 | 4 | 4 | 5 | 5 |
求子串:#include <cstdio> #include <cstring> #define MAXLen 1000 char seq1[MAXLen]; char seq2[MAXLen]; int maxLen[MAXLen][MAXLen]; int main() { while(scanf("%s%s",seq1+1,seq2+1)) { int length1=strlen(seq1+1); int length2=strlen(seq2+1); for(int i=0; i<=length1; i++) maxLen[i][0]=0; for(int j=0; j<=length2; j++) maxLen[0][j]=0; for(int i=1; i<=length1; i++) { for(int j=1; j<=length2; j++) { if(seq1[i]==seq2[j]) maxLen[i][j]=maxLen[i-1][j-1]+1; else maxLen[i][j]=maxLen[i-1][j]>maxLen[i][j-1]?maxLen[i-1][j]:maxLen[i][j-1]; } } printf("%d\n",maxLen[length1][length2]); } return 0; }
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; char str1[1005],str2[1005]; int d[1005][1005]; int main() { while(gets(str1)&&gets(str2)) { int len1=strlen(str1),len2=strlen(str2); memset(d,0,sizeof(d)); for(int i=len1-1; i>=0; i--) for(int j=len2-1; j>=0; j--) { if(str1[i]==str2[j]) d[i][j]=d[i+1][j+1]+1; else d[i][j]=max(d[i+1][j],d[i][j+1]); } //printf("%d\n",d[0][0]); int i = 0, j = 0; while (i < len1 && j < len2){ if (str1[i] == str2[j]){ printf("%c",str1[i]); i++; j++; } else if (d[i+1][j] >= d[i][j+1]) i++; else j++; } printf("\n"); } return 0; }