Problem description : Given two sequences , for example  X = “ABCBDAB”,Y = “BDCABA”, Find the length of their longest common subsequence .
 The following is the dynamic programming table when solving , It can be seen that  X  and  Y  The length of the longest common subsequence of is 4:
  It is not difficult to output a longest common subsequence ( There are many related codes on the Internet ), The difficulty is to output all the longest common subsequences , because  LCS  Usually not unique .
 We need to do backtracking on the dynamic programming table  ——  from c[m][n], That is, the lower right corner of the grid , Start judging :  If the grid c[i][j] Corresponding X[i-1] == Y[j-1]
, Put this character in the  LCS  in , And jump in c[i-1][j-1] Continue to judge in the process ;  If the grid c[i][j] Corresponding  X[i-1] ≠ Y[j-1], Then compare c[i-1][
j] and c[i][j-1] Value of , Jump into the larger value of the grid to continue to judge ;  If it appears c[i-1][j] be equal to c[i][j-1]
 The situation of , Indicates that there are more than one longest common subsequence , So both sides have to go back ( Recursion is used here ).  until  i  or  j  Less than or equal to zero , Reverse order output  LCS . 
  From the red path shown above ,X  and  Y  The longest common subsequence of is  3  individual , They are  “BDAB”,“BCAB”,“BCBA”.
 C++ code :
#include<bits/stdc++.h> using namespace std; string X ; string Y ; vector<
vector<int> > c; //  Dynamic planning table  set<string> lcs; // set Save all LCS int lcs_length(int m, 
int n) { //  The size of the table is (m+1)*(n+1) c = vector<vector<int> >(m+1,vector<int>(n+1)); for
(int i=0; i<m+1; ++i) { for(int j=0; j<n+1; ++j) { //  First row and first column 0 if (i == 0 || j 
== 0) c[i][j] = 0; else if(X[i-1] == Y[j-1]) c[i][j] = c[i-1][j-1] + 1; else c[i
][j] = max(c[i-1][j], c[i][j-1]); } } return c[m][n]; } void lcs_print(int i, 
int j, string lcs_str) { while (i>0 && j>0) { if (X[i-1] == Y[j-1]) { lcs_str.
push_back(X[i-1]); // cout<<X[i-1]<<endl; --i; --j; } else { if (c[i-1][j] > c[i
][j-1]) --i; else if (c[i-1][j] < c[i][j-1]) --j; else { lcs_print(i-1, j, 
lcs_str); lcs_print(i, j-1, lcs_str); return; } } } // cout<<lcs_str<<endl; 
reverse(lcs_str.begin(),lcs_str.end()); lcs.insert(lcs_str); } int main() { cin
>>X>>Y; int m = X.length(); int n = Y.length(); int length = lcs_length(m, n); 
cout<< "The length of LCS is " << length << endl; string str; lcs_print(m, n, 
str); set<string>::iterator it = lcs.begin(); for( ; it!=lcs.end(); it++) cout 
<< *it << endl; return 0; } 
 Operation effect :
Technology