Understand Longest Common Subsequence

#foundation #algorithm

source wikipedia

The table below shows the steps of generating LCS.

0 1 2 3 4 5 6 7
Ø M Z J A W X U
0 Ø 0 0 0 0 0 0 0 0
1 X 0 0 0 0 0 0 1 1
2 M 0 1 1 1 1 1 1 1
3 J 0 1 1 2 2 2 2 2
4 Y 0 1 1 2 2 2 2 2
5 A 0 1 1 2 3 3 3 3
6 U 0 1 1 2 3 3 3 4
7 Z 0 1 2 2 3 3 3 4

Here are the steps intepreted:

  • given 2 strings: s1, s2, make them to char array:
char[] seq1 = s1.toCharArray();
char[] seq2 = s2.toCharArray();
int i = seq1.length;
int j = seq2.length;
  • create 2 dimensional array using seq1, seq2:
char[][] matrix = new char[i][j]
  • from tail to head, we do:
function lcs(matrix, seq1, seq2, i, j):
if i == 0 or j == 0: return " ";
else if seq1[i-1] == seq2[j-1]: return lcs(matrix, seq1, seq2, i, j) + seq1[i-1];
else:
    if matrix[i][j-1] > matrix[i-1][j]: return lcs(matrix, seq1, seq2, i, j-1)
    else lcs(matrix, seq1, seq2, i-1, j)