题目描述:
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
输入
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
输出
输出最长的子序列,如果有多个,随意输出1个。
输入示例
abcicba
abdkscab
输出示例
abca
import java.util.Scanner;
public class LCS {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
char[] a = scanner.next().toCharArray();
char[] b = scanner.next().toCharArray();
int n1 = a.length;
int n2 = b.length;
if (n1 == 0 || n2 == 0) {
System.out.println(0);
return ;
}
int n = Math.max(n1, n2);
int[][] arr = new int[n + 1][n + 1];
int[][] bb = new int[n+1][n+1];
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i <= n1; i++)
arr[i][0] = 0;
for (int i = 0; i <= n2; i++)
arr[0][i] = 0;
for (int i = 1; i <= n1; i++) {
for (int j = 1; j <= n2; j++) {
if (a[i - 1] == b[j - 1]) {
arr[i][j] = arr[i - 1][j - 1] + 1;
bb[i][j] = 0;
}
else if (arr[i-1][j] >= arr[i][j-1]){
arr[i][j] = arr[i-1][j];
bb[i][j] = 1;
} else {
arr[i][j] = arr[i][j - 1];
bb[i][j] = 2;
}
}
}
lcs(bb, a, n1, n2, stringBuilder);
System.out.println(stringBuilder.toString());
}
public static void lcs(int[][] b, char[] a, int i, int j, StringBuilder stringBuilder) {
if (i == 0 || j == 0)
return ;
if (b[i][j] == 0) {
lcs(b, a, i - 1, j - 1, stringBuilder);
stringBuilder.append(a[i-1]);
} else if (b[i][j] == 1) {
lcs(b, a, i-1, j, stringBuilder);
} else
lcs(b, a, i, j-1, stringBuilder);
}
}