(動態規劃)最長公共子序列

問題描述:
java

  給定序列 X 與 Y,若 Z 既是 X 的子序列,又是 Y 的子序列,則成 Z 爲 X 和 Y 的公共子序列。Z中包含元素最多的子序列就是最大公共子序列。ide

好比:X={A,B,C,B,D,A,B},Y ={C,B,C,E,D,B},則{B,C,D,B}是最大公共子序列。函數

任意兩個字符串 X 與 Y 的最大公共子序列的求法:spa

利用動態規劃法:blog

   遞推公式:194012767.png
字符串

代碼實現:get

/**
     * 最長公共子序列
     * seq1:第一個序列
     * seq2:第二個序列
     * */
    public int LongComSubSeq(int[] seq1,int[] seq2){       
        if(seq1==null||seq1.length==0||seq2==null||seq2.length==0){
            return -1;
        }
        int len1 = seq1.length+1;
        int len2 = seq2.length+1;
        //存放公共子串的長度
        int[][] LCSLen = new int[len1][len2];
        //存放
        int[][] LCSDrec = new int[len1][len2];
        //接下來三個循環爲初始化
        for(int i=0;i<len1;i++){
            LCSLen[i][0] = 0;
        }
        for(int j=0;j<len2;j++){
            LCSLen[0][j] = 0;
        }
        for(int i=0;i<len1;i++){
            for(int j=0;j<len2;j++){
                LCSDrec[i][j] =0;
            }
        }
        for(int i=1;i<len1;i++){
            for(int j=1;j<len2;j++){
                if(seq1[i-1] == seq2[j-1]){
                    //System.out.println("序列值seq1:"+seq1[i-1]);
                    // System.out.println("序列值seq2:"+seq2[j-1]);
                    LCSLen[i][j] = LCSLen[i-1][j-1]+1;
                    // System.out.println("序列長度:"+LCSLen[i][j]);
                    LCSDrec[i][j] = 1;
                }else if(LCSLen[i-1][j]>LCSLen[i][j-1]){
                    LCSLen[i][j] = LCSLen[i-1][j];
                    LCSDrec[i][j] = 2;
                }else {
                    LCSLen[i][j] =LCSLen[i][j-1];
                    LCSDrec[i][j] = 3;
                }
                              
            }
        }
        LCSPrint(LCSDrec,seq1,len1-1,len2-1);
        return LCSLen[len1-1][len2-1];     
    }
    //最長公共子序列輸出函數
    public void LCSPrint(int[][] LCSDrec,int[] seq1,int len1,int len2){
        if(LCSDrec==null||seq1==null||len1<=0||len2<=0){
            return;
        }
        if(LCSDrec[len1][len2]==1){
            System.out.println(" "+seq1[len1-1]);          
            LCSPrint(LCSDrec,seq1,len1-1,len2-1);
        }else if(LCSDrec[len1][len2]==2){
            LCSPrint(LCSDrec,seq1,len1-1,len2);
        }else{
            LCSPrint(LCSDrec,seq1,len1,len2-1);
        }      
    }
相關文章
相關標籤/搜索