master
 1require 'pp'
 2
 3def lcs(s: , t: )
 4  #matrix = [ [0] * (t.size + 1) ] * (s.size + 1)
 5  matrix = Array.new(s.size + 1) { Array.new(t.size + 1, 0) }
 6
 7  (s.size - 1).downto(0) do |i|
 8    (t.size - 1).downto(0) do |j|
 9      if s[i] == t[j]
10        matrix[i][j] = 1 + matrix[i+1][j+1]
11      else
12        matrix[i][j] = [matrix[i][j+1], matrix[i+1][j]].max
13      end
14    end
15  end
16  # backtracking from 0, 0. follow the matches
17  result = ""
18  i, j = 0, 0
19  until matrix[i][j] <= 0
20    if s[i] == t[j]
21      result << s[i]
22      i += 1
23      j += 1
24    else
25      if matrix[i][j + 1] > matrix[i + 1][j]
26        j+=1
27      else
28        i+=1
29      end
30    end
31  end
32  result
33end
34
35PP.pp lcs(s: "GGCACCACG", t: "ACGGCGGATACG")