public class 公共最长子序列 {
public static void main(String args[]) {
char[] x = {'a', 'b', 'c', 'b', 'd', 'a', 'b'};
char[] y = {'b', 'd', 'c', 'a', 'b', 'a'};
int[][] b = new int[x.length + 1][y.length + 1];
System.out.print("最长公共子序列:");
int n = lcsLength(x, y, b);
System.out.println();
System.out.println("其长度为:" + n);
}
public static int lcsLength(char[] x, char[] y, int[][] b) {
int m = x.length;
int n = y.length;
int[][] c = new int[m + 1][n + 1];
for (int i = 0; i <= m; i++) c[i][0] = 0;
for (int i = 0; i <= n; i++) c[0][i] = 0;
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++) {
if (x[i - 1] == y[j - 1]) {
c[i][j] = c[i - 1][j - 1] + 1;
b[i][j] = 1;
} else if (c[i - 1][j] >= c[i][j - 1]) {
c[i][j] = c[i - 1][j];
b[i][j] = 2;
} else {
c[i][j] = c[i][j - 1];
b[i][j] = 3;
}
}
int i = m;
int j = n;
lcs(i, j, x, b);
return c[m][n];
}
public static void lcs(int i, int j, char[] x, int[][] b) {
if (i == 0 || j == 0) return;
if (b[i][j] == 1) {
lcs(i - 1, j - 1, x, b);
System.out.print(x[i - 1] + ",");
} else if (b[i][j] == 2) lcs(i - 1, j, x, b);
else lcs(i, j - 1, x, b);
}
}
最长公共子序列(java包含打印长度与子序列)
最新推荐文章于 2022-04-29 08:56:32 发布