/* * 算法导论最长公共子序列 */ 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); } } }
原文:http://blog.csdn.net/q389281541/article/details/45097345