public class LcsLength {
static int[][] c;
public static int lcsLength(char[] x, char[] y, int[][] b) {
int m = x.length - 1;
int n = y.length - 1;
c = new int[m+1][n+1];
for(int i = 1; i <= m; i++) {
c[i][0] = 0; // 给列赋值
}
for (int i = 1; i <= n; i++) {
c[0][i] = 0;
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (x[i] == y[j]) {
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; // 消列
}
}
}
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]);
}else if (b[i][j] == 2) lcs(i - 1,j,x,b);
else lcs(i,j - 1,x,b);
}
public static void main(String[] args) {
char[] x = {'0','A','C','T','C','C','T','A','G'};
char[] y = {'0','C','A','T','T','C','A','G','C'};
int[][] b = new int[x.length][y.length];
LcsLength.lcsLength(x,y,b);
System.out.println("-------------b-------------");
System.out.println(Arrays.toString(b[0]));
System.out.println(Arrays.toString(b[1]));
System.out.println(Arrays.toString(b[2]));
System.out.println(Arrays.toString(b[3]));
System.out.println(Arrays.toString(b[4]));
System.out.println(Arrays.toString(b[5]));
System.out.println(Arrays.toString(b[6]));
System.out.println(Arrays.toString(b[7]));
System.out.println(Arrays.toString(b[8]));
System.out.println("------------c--------------");
System.out.println(Arrays.toString(c[0]));
System.out.println(Arrays.toString(c[1]));
System.out.println(Arrays.toString(c[2]));
System.out.println(Arrays.toString(c[3]));
System.out.println(Arrays.toString(c[4]));
System.out.println(Arrays.toString(c[5]));
System.out.println(Arrays.toString(c[6]));
System.out.println(Arrays.toString(c[7]));
System.out.println(Arrays.toString(c[8]));
// 打印:
LcsLength.lcs(8,8,x,b);
}
}
最长公共子序列
最新推荐文章于 2024-04-19 21:11:21 发布