/*
* 算法导论最长公共子序列
*/
public class LCS {
private String X = null; //序列x1..xm
private String Y = null; //序列y1..yn
private int[][] c= null; //c[i][j]表示Xi和Yj的LCS长度
private int xlen = 0; //序列x的长度
private int ylen = 0; //序列y的长度
public static void main(String[] args) {
//算法导论基因序列
String str1 = "ACCGGTCGAGTGCGCGGAAGGAAGCCGGCCGAA";
String str2 = "GTCGTTCGGAATGCCGTTGCTCTGTAAA";
LCS lcs = new LCS(str1,str2);
lcs.lcsLength();
lcs.printLCS(lcs.xlen, lcs.ylen);
}
public LCS(String x, String y) {
X = x;
Y = y;
xlen = X.length();
ylen = Y.length();
c = new int[xlen+1][ylen+1];
}
private void lcsLength() {
for(int i=0;i<=xlen;i++) { //当y为空时,LCS长度为0
c[i][0] = 0;
}
for(int j=0;j<=ylen;j++) { //当x为空时,LCS长度为0
c[0][j] = 0;
}
for(int i=1;i<=xlen;i++) {
for(int j=1;j<=ylen;j++) {
if(X.charAt(i-1) == Y.charAt(j-1)) {
c[i][j] = c[i-1][j-1] + 1;
} else {
c[i][j] = (c[i-1][j] >= c[i][j-1] ? c[i-1][j] : c[i][j-1]);
}
}
}
}
private void printLCS(int i,int j) {
if(i==0 || j==0) {
return;
}
if(X.charAt(i-1) == Y.charAt(j-1)) {
printLCS(i-1,j-1);
System.out.print(X.charAt(i-1));
} else if(c[i-1][j] >= c[i][j-1]) {
printLCS(i-1,j);
} else {
printLCS(i,j-1);
}
}
}
运行结果与算法导论上一致:
GTCGTCGGAAGCCGGCCGAA