Transmission Door
Description
Given two string a B, the longest common subsequence of A and B (the subsequence is not required to be contiguous).
For example, two strings are: ABCICBAAbdkscab AB is a subsequence of two strings, and ABC is also, ABCA, where ABCA is the longest subsequence of the two strings.
Input
Line 1th: String A line 2nd: string B (length <= 1000)
Output
Output the longest sub-sequence, if there are multiple, randomly output 1.
Sample Input
Abcicbaabdkscab
Sample Output
Abca
Ideas
Remember:
Xi=﹤x1,?,xi﹥ is the first I character (1≤i≤m) (prefix) of the x sequence
Yj=﹤y1,?,yj﹥ is the first J character (1≤j≤n) (prefix) of the y sequence
Assume Z=﹤z1,?,zk﹥∈lcs (X, Y).
If the Xm=yn (the last character is the same), it is not difficult to prove with contradiction: the character must be x and y of any of the longest common subsequence Z (set length k) The last character, that is, ZK = XM = yn and apparently Zk-1∈lcs (Xm-1, Yn-1) That is, the prefix Zk-1 of z is the longest common subsequence of Xm-1 and Yn-1. At this point, the problem is attributed to the Xm-1 and Yn-1 LCS (the length of the LCS (X, Y) equals the length of the LCS (Xm-1, Yn-1) plus 1).
If Xm≠yn, it is also not difficult to prove with contradiction: either Z∈lcs (Xm-1, Y), or Z∈lcs (X, Yn-1). Since ZK≠XM and Zk≠yn have at least one of them to be established, if ZK≠XM has Z∈lcs (Xm-1, Y), similarly, Zk≠yn (X, Z∈lcs). At this point, the problem is attributed to Xm-1 and y LCS and X and Yn-1 LCS. The length of the LCS (x, y) is: Max{lcs (Xm-1, y), length of LCS (X, Yn-1)}.
Because the length of the LCS (Xm-1, Y) and the length of the LCS (X, Yn-1) are not independent of each other in the case of Xm≠yn: both require the length of the LCS (xm-1,yn-1). The two other sequences of LCS contain two sequence prefixes of LCS, so the problem has the optimal substructure properties considering the dynamic programming method.
In other words, to solve this LCS problem, you ask for three things:
-
- 1, LCS (xm-1,yn-1) +1;
- 2, LCS (Xm-1,y), LCS (x,yn-1);
- 3, max{LCS (Xm-1, Y), LCS (X, Yn-1)}.
structure of the longest common sub-sequence
The structure of the longest common subsequence is represented as follows:
Set sequence x=< x1, x2, ..., xm > and y=< y1, y2, ..., yn > one of the longest common sub-sequences z=< z1, Z2, ..., ZK;, then:
- If Xm=yn, then Zk=xm=yn and Zk-1 are the longest common subsequence of Xm-1 and Yn-1;
- If Xm≠yn and ZK≠XM, then Z is the longest common subsequence of Xm-1 and y;
- If Xm≠yn and Zk≠yn, Z is the longest common sub-sequence of x and Yn-1.
Among them Xm-1 = < X1, x2, ..., xm-1 >,yn-1 = < Y1, y2, ..., yn-1 >,zk-1 = < Z1, Z2, ..., zk-1 >.
We define C[i, J] to denote the length of the LCS of Xi and Yi. If I = 0 or j = 0, which is a sequence length of 0, the length of the LCS is 0. According to the optimal substructure property of the LCS problem, the following formula can be obtained:
|
|
0 |
If I = 0 or j = 0 |
C[i, J] |
= |
C[I-1,J-1] + 1 |
If I, J > 0 and Xi = Yi |
|
|
Max (C[i, J-1],c[i-1, J]) |
If I, J > 0 and Xi≠yi |
#include <stdio.h> #include <string.h>const int maxn = 1005;int Dp[maxn][maxn] = {0};int main () {char a[maxn],b [Maxn],lcs[maxn];int i,j;scanf ("%s", a); scanf ("%s", b); int Lena = strlen (a), LenB = strlen (b); for (i = 1;i <= lena;i++) {f or (j = 1;j <= lenb;j++) {if (a[i-1] = = B[j-1]) dp[i][j] = dp[i-1][j-1]+1;elsedp[i][j] = dp[i][j-1]>dp[i-1][j]?dp[i][j -1]:d p[i-1][j];}} i = Lena,j = Lenb;int len = Dp[lena][lenb];lcs[len] = ' + ', while (Dp[i][j]) {if (dp[i][j] = = Dp[i-1][j]) i--;else if (dp[i][ J] = = Dp[i][j-1]) j--;else Lcs[--len] = A[i-1],i--, j--;} printf ("%s\n", LCS); return 0;}
1006 Longest common subsequence LCS (classic dynamic planning)