问题:
求解两个数组的最长公共子序列LCS(Longest Common Subsequence)。
思路:
如果要求一个问题的最优解(通常是最大值或者最小值),而且该问题能够分解成若干个子问题,并且小问题之间也存在重叠的子问题,则考虑采用动态规划。
设 X=(x1,x2,.....xn) 和 Y={y1,y2,.....ym} 是两个序列,将 X 和 Y 的最长公共子序列记为LCS(X,Y)。
1. 如果 x[n] = y[m],则LCS(X,Y) = LCS( X[n-1], Y[m-1] )。
2. 如果 x[n] != y[m],则LCS(X,Y) = MAX{ LCS( X[n-1], Y[m] ), LCS( X[n], Y[m-1] )}。
示例:
X= "BDCABA";
Y= "ABCBDAB";
code:
1 public class LCSequence { 2 public static int LCS(String X, String Y){ 3 int[][] c = new int[X.length()+1][Y.length()+1]; 4 for (int i = 0; i <= X.length(); i++) {//x为空时初始化 5 c[i][0] = 0; 6 } 7 for (int i = 0; i <= Y.length(); i++) { 8 c[0][i] = 0; 9 } 10 11 for (int i = 1; i <= X.length(); i++) { 12 for (int j = 1; j <= Y.length(); j++) { 13 14 if (X.charAt(i-1) == Y.charAt(j-1)) 15 c[i][j] = c[i-1][j-1] + 1; 16 else if ( c[i-1][j] > c[i][j-1]) 17 c[i][j] = c[i-1][j]; 18 else 19 c[i][j] = c[i][j-1]; 20 } 21 } 22 return c[X.length()][Y.length()]; 23 24 } 25 26 public static void main(String[] args) { 27 String str1 = "BDCABA"; 28 String str2 = "ABCBDAB"; 29 int result = LCS(str1, str2); 30 System.out.println(result); 31 } 32 }