public class LCS {

   public static String lcs(String s, String t) {
      int n = s.length();
      int m = t.length();
      int l[][] = new int[n+1][m+1];
      for (int i = n-1; i >= 0; i--) {
         for (int j = m-1; j >= 0; j--) {
            char a = s.charAt(i);
            char b = t.charAt(j);
            if (a == b) {
               l[i][j] = 1 + l[i+1][j+1];
            } else {
               l[i][j] = Math.max(l[i][j+1], l[i+1][j]);
            }
         }
      }
      
      StringBuilder result = new StringBuilder();
      int i = 0;
      int j = 0;
      while (i < n && j < m) {
         char a = s.charAt(i);
         char b = t.charAt(j);
         if (a == b) {
            result.append(a);
            i++;
            j++;
         } else {
            if (l[i][j] == l[i+1][j]) {
               i++;
            } else {
               j++;
            }
         }
      }
      
      return result.toString();
   }
   
   
   public static void main(String[] args) {
      String s = "ACCGAGTTCGGACTTA";
      String t = "CCATTGCTCCCATTACGG";
      System.out.println(lcs(s,t));
   }   

}