最长公共子序列__java实现

Posted wainzhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长公共子序列__java实现相关的知识,希望对你有一定的参考价值。

关键代码:

for(int i=1;i<=x.length;i++){
for(int j=1;j<=y.length;j++){
if(x[i-1]==y[j-1]){
c[i][j] = c[i-1][j-1]+1;
b[i][j] = 1;
}else{
if(c[i-1][j]>=c[i][j-1]){
c[i][j] = c[i-1][j];
b[i][j] = 2;
}else{
c[i][j] = c[i][j-1];
b[i][j] = 3;
}
}
}
}

上述,i=0或j=0时,即X或Y为空序列时,c[i][j]=0。

 

完整代码:

public class ZCGGZXL {
    /**
     * 最长公共子序列
     *
     * 问题:
     *     给定两个序列X={x1,x2,...,xn} 和 Y={y1,y2,...,,yn},找出X和Y的最长公共子序列。
     *
     * 测试输入:
     *     A B C B D A B
     *     B D C A B A
     * 测试输出:
     *     4
     *     BCBA
     */

    public static void main(String args[]){
        char[] x = {‘A‘,‘B‘,‘C‘,‘B‘,‘D‘,‘A‘,‘B‘};
        char[] y = {‘B‘,‘D‘,‘C‘,‘A‘,‘B‘,‘A‘};
        int[][] b = new int[x.length+1][y.length+1];
        int[][] c = lcsLength(x,y,b);
        System.out.println(c[x.length][y.length]);
        lcs(x.length,y.length,x,b);
    }

    /**
     * 输入:x序列,y序列
     * 输出:b数组,返回数组c。
     * c[i][j]存储Xi和Yj的最长公共子序列的长度
     * b[i][j]记录c[i][j]的值是由哪一个子问题的解得到的,在构造最长公共子序列时要用到。
     * @return
     */
    public static int[][] lcsLength(char[] x,char[] y,int[][] b) {
        // 初始化数组c
        int[][] c = new int[x.length+1][y.length+1]; //0存空序列
        for(int i=0;i<c.length;i++){
            for(int j=0;j<c[0].length;j++){
                c[i][j] = 0;
            }
        }
        // 开始规划
        for(int i=1;i<=x.length;i++){
            for(int j=1;j<=y.length;j++){
                if(x[i-1]==y[j-1]){
                    c[i][j] = c[i-1][j-1]+1;
                    b[i][j] = 1;
                }else{
                    if(c[i-1][j]>=c[i][j-1]){
                        c[i][j] = c[i-1][j];
                        b[i][j] = 2;
                    }else{
                        c[i][j] = c[i][j-1];
                        b[i][j] = 3;
                    }
                }
            }
        }
        return c;
    }

    public static void lcs(int i,int j,char[]x,int[][]b){
        // 结束条件
        if(i==0 || j==0) return;

        // 判断b[i][j]进入不同分支
        if(b[i][j]==1){
            lcs(i-1,j-1,x,b);
            System.out.print(x[i-1]);
        }else{
            if(b[i][j]==2) lcs(i-1,j,x,b);
            else lcs(i,j-1,x,b);
        }
    }
}
  

  

以上是关于最长公共子序列__java实现的主要内容,如果未能解决你的问题,请参考以下文章

动态规划_公共最长子序列 java

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

P1439 模板最长公共子序列 题解

算法导论_动态规划_最长公共子序列

动态规划法最长公共子序列(LCS)问题

POJ - 1458 Common Subsequence (LCS最长公共子序列)