动态规划之最长公共子序列

来源:互联网 发布:布林线指标源码 编辑:程序博客网 时间:2024/05/18 13:28
/* * 算法导论最长公共子序列 */public class LCS {private String X = null;//序列x1..xmprivate String Y = null;//序列y1..ynprivate 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长度为0c[i][0] = 0;}for(int j=0;j<=ylen;j++) {//当x为空时,LCS长度为0c[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


0 0