package FAN2;
/**
* 最长公共子序列:
* 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
* 比如两个串为:
* abcicba
* abdkscab
* ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
*/
public class DP07_LCS {
public static void main(String[] args) {
String a = "abcicba";
String b = "abdkscab";
int alen = a.length();
int blen = b.length();
int[][] dp = new int[alen + 1][blen + 1];
for (int i = 1; i < alen + 1; i++) {
for (int j = 1; j < blen + 1; j++) {
if (dp[i - 1][j] == dp[i][j - 1] && a.charAt(i - 1) == b.charAt(j - 1)
&& dp[i - 1][j] == dp[i - 1][j - 1]) {
dp[i][j] = dp[i - 1][j] + 1;
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
// a b d k s c a b
// 0 0 0 0 0 0 0 0 0
// a 0 1 1 1 1 1 1 1 1
// b 0 1 2 2 2 2 2 2 2
// c 0 1 2 2 2 2 3 3 3
// i 0 1 2 2 2 2 3 3 3
// c 0 1 2 2 2 2 3 3 3
// b 0 1 2 2 2 2 3 3 4
// a 0 1 2 2 2 2 3 4 4
int max = dp[alen][blen];
System.out.println(max);
StringBuilder sb = new StringBuilder();
while (max > 0) {
if (dp[alen - 1][blen] == dp[alen][blen - 1] && dp[alen - 1][blen] + 1 == dp[alen][blen]) {
sb.append(a.charAt(alen - 1));
max--;
alen--;
blen--;
} else {
if (dp[alen][blen - 1] == dp[alen][blen]) {
blen--;
} else {
alen--;
}
}
}
System.out.println(sb.reverse().toString());
}
}