刚开始按照自己的思路写出来结果是不多了,而且还出现了数组越界异常,在一点点的修改下,终于对了,但是还有很多可以改进的地方
package first;
//最长公共子序列
public class LCS {
public static void main(String[] args) {
String[] a = new String[] { "A", "B", "C", "Z" };
String[] b = new String[] { "B", "C", "A", "Z" };
int m = a.length;
int n = b.length;
int[][] c = new int[10][10];
int[][] d = new int[10][10];
lcslength(a, b, m, n, c, d);
lcs(a, m, n, c, d);
}
// 计算最长子序列长度的方法
public static void lcslength(String[] a, String[] b, int m, int n,
int[][] c, int[][] d) {
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (a[i - 1] == b[j - 1]) {
c[i][j] = c[i - 1][j - 1] + 1;
d[i][j] = 1;
} else if (c[i - 1][j] > c[i][j - 1]) {
c[i][j] = c[i - 1][j];
d[i][j] = 2;
} else {
c[i][j] = c[i][j - 1];
d[i][j] = 3;
}
}
}
}
// 输出最长子序列
public static void lcs(String[] a, int i, int j, int[][] c, int[][] d) {
if (i == 0 || j == 0)
return;
if (d[i][j] == 1) {
lcs(a, i - 1, j - 1, c, d);
System.out.print(a[i - 1]);
} else if (d[i][j] == 2) {
lcs(a, i - 1, j, c, d);
} else
lcs(a, i, j - 1, c, d);
}
}