最长公共子序列

 问题:

  求解两个数组的最长公共子序列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 }
原文地址:https://www.cnblogs.com/yumingxing/p/9588410.html