【算法設計與分析】最長公共子序列

/**
 * 求最長公共子序列長度
 * @author 劉劉
 */
public class LcsLength {
	
	public static int lcsLength(char []x,char []y){
		int m = x.length-1;//3
		int n = y.length-1;//5
		int [][]c = new int[m+1][n+1]; // c[i][j]存儲了Xi和Yj的最長公共子序列的長度
		for(int i = 1;i <= m;++i) c[i][0] = 0; // Y序列爲空時的最長序列
		for(int i = 1;i <= n;++i) c[0][i] = 0; // X序列爲空時的最長序列
		
		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; // 子問題劃分,公共序列+1
				}else if(c[i-1][j] >= c[i][j-1]){ // 對應不相等
					c[i][j] = c[i-1][j]; // 比較X[i-1]和Y[j]
				}else{
					c[i][j] = c[i][j-1]; // 比較X[i]和Y[j-1]
				}
			}			
		}
		return c[m][n]; // 最大公共子序列
	}
	public static void main(String[] args) {
		char []x = {'0','B','C','D'}; // 從序號1開始比較
		char []y = {'0','A','B','D','C','D'};
		int n = lcsLength(x, y);
		System.out.println(n);
	}
}

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章