Java------最長公共子序列
阿新 • • 發佈:2018-11-17
-
package test; public class test3 { public static void main(String[] args) { // TODO Auto-generated method stub String []x=new String[]{"","A","C","T","C","C","T","A","G"};//比較序列X String []y=new String[]{"","C","A","T","T","C","A","G","C"};//比較序列Y int [][]b=new int [x.length][y.length];//陣列b是用來儲存c[i][j]是由哪個子問題的解得到的 int m,n; m=x.length-1; n=y.length-1; lcsLength(x,y,b); lcs(m,n,x,b); } public static int lcsLength(String []x,String[]y,int[][]b){ int m=x.length-1; int n=y.length-1; int [][]c=new int[m+1][n+1];//陣列c儲存最長公共子序列的長度 for(int i=1;i<=m;i++) c[i][0]=0; for(int i=1;i<=n;i++) c[0][i]=0; 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 b[i][j]=1;//規定為1時,表示Xi和Yj的最長公共子序列是由Xi-1和Yj-1的 //最長公共子序列加上當前元素(即指向左上角) } else if(c[i-1][j]>c[i][j-1]){ c[i][j]=c[i-1][j]; b[i][j]=2;//規定為2時,表示Xi和Yj的最長公共子序列是由Xi-1和Yj的 //最長公共子序列相同(即指向左邊) } else{ c[i][j]=c[i][j-1]; b[i][j]=3;//規定為3時,表示Xi和Yj的最長公共子序列是由Xi和Y的 //最長公共子序列相同(即指向左邊) } } return c[m][n]; } public static void lcs(int i,int j,String []x,int [][]b){ if(i==0||j==0) return ; if(b[i][j]==1){ lcs(i-1,j-1,x,b); System.out.print(x[i]); } else if(b[i][j]==2) lcs(i-1,j,x,b); else lcs(i,j-1,x,b); } }
如 上圖(這個圖是從其他地方找來的,不是我自己弄的),當b[i][j]=1時,往左上角(即最長公共子序列由左上角+1得到),其他類推
公共子序列不是集合,它與集合不同,它與原來序列的順序有關,誰在前誰在後