您的位置:首页 > 其它

最长公共子序列 LCS

2013-06-15 16:37 274 查看
public class LCS {

public static void main(String[] args) {
char[] x = new char[]{' ','A','B','C','B','D','A','B'};
char[] y = new char[]{' ','B','D','C','A','B','A'};
int m = x.length-1;
int n = y.length-1;
int[][] c = new int[m+1][n+1];
int[][] b = new int[m+1][n+1];
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] = 2;//左上 0
} else if(c[i-1][j] >= c[i][j-1]) {
b[i][j] = -1;//上 -1
c[i][j] = c[i-1][j];
}
else {
b[i][j] = 1;//左 1
c[i][j] = c[i][j-1];
}
}
}
LCS lcs = new LCS();
lcs.print(b, x, m, n);
}

private void print(int[][] b, char[] x, int i, int j) {//当在b[i][j] == 0时表明x[i]=y[j]是lcs的一个元素
if(i == 0 || j==0) return;
if(b[i][j] == 2) {
print(b,x,i-1,j-1);
System.out.print(x[i] + " ");
} else if(b[i][j] == -1) {
print(b,x,i-1,j);
} else {
print(b,x,i,j-1);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: