package com.interview.algorithms.string; /** * Created_By: stefanie * Date: 14-7-7 * Time: 下午9:34 * * Write a method to find the longest common sequence (no need to be continuous) of characters. */ public class C11_11_LongestCommonSubsequence { public static String LCS(String str1, String str2){ int M = str1.length() + 1; int N = str2.length() + 1; int[][] c = new int[M][N]; int[][] b = new int[M][N]; for(int i = 0; i < M; i++) c[i][0] = 0; for(int i = 0; i < N; i++) c[0][i] = 0; for(int i = 1; i < M; i++){ for(int j = 1; j < N; j++){ if(str1.charAt(i - 1) == str2.charAt(j - 1)){ c[i][j] = c[i-1][j-1] + 1; b[i][j] = 0; } else { if(c[i-1][j] > c[i][j-1]){ c[i][j] = c[i-1][j]; b[i][j] = -1; } else { c[i][j] = c[i][j-1]; b[i][j] = 1; } } } } return backtrace(c, b, str1, str2); } private static String backtrace(int[][] c, int[][] b, String str1, String str2){ int i = str1.length(); int j = str2.length(); int length = c[i][j]; char[] chars = new char[length]; while(length != 0){ if(b[i][j] == 0){ chars[length - 1] = str1.charAt(i - 1); length = c[--i][--j]; } else if(b[i][j] == 1) j--; else i--; } return String.copyValueOf(chars); } }