最长公共子序列LCS-DP

1.最长公共子序列

是指按顺序从两个字符串中获取的公共包含的元素集合。
ABCDFD
ANNBMMF
ABF就是

动态规划

把一个大问题规划成好几个同样的子问题,然后分别求解。
最长公共子序列LCS-DP_第1张图片


public class LCSSTRING {

/* 获取最长 公共子序列 */
public class LCSSTRING {

    /* 获得状态转移数组 即得到一个数组用来存放字符串的信息实现DP */
    public static int[][] lcs(String x,String y){
        /* 数组前面要包含一个 0行 0 列 然后才接上字符串 的行和列 所以创建的时候要+1*/
        int [][] c = new int[x.length()+1][y.length()+1];
        /* 循环遍历两个字符串  */
        for(int i = 1;i <=  x.length();i++){
            for(int j = 1;j <= y.length();j++){
                System.out.println(" i:" + i + "j :" + j + "str : " + x.charAt(i-1) + "  "+ y.charAt(j-1));
                /* 字符串相等那么状态转移数组的值 为 左上角 +1 否则取上和左的最大值 */
                 if(x.charAt(i-1) == y.charAt(j-1)){
                    c[i][j] = c[i-1][j-1] + 1;
                }else if(c[i][j-1] >= c[i-1][j]){
                    c[i][j] = c[i][j-1];
                }else if(c[i][j-1] < c[i-1][j]){
                    c[i][j] = c[i-1][j];
                }

            }
        }
        return c;
    }
    public static void print(int [][]outarr,String x,String y){
        for(int i = 0;i < x.length()+1;i++){
            for(int j = 0; j < y.length()+1;j++){
                System.out.print(outarr[i][j] + " ");
            }
            System.out.println();
        }
    }
    /* 输出字符串 */
    public static void getLcstring(String x,String y,int [][]c){
        /* 此处不能使用两个for循环,因为两次for循环是分别进行m*n的遍历,使用一个for循环两个条件,是要一个不满足就break。 */
        for(int i = x.length(), j = y.length();i>=1 && j>=1;){

                if(x.charAt(i-1) == y.charAt(j-1)){
                    System.out.println("element: " + x.charAt(i-1)  + "\t" + " i: " + i + " j: "+j);
                    i--;
                    j--;
                }else if(c[i-1][j] >= c[i][j-1]){
                    i--;
                }else if(c[i-1][j] < c[i][j-1]){
                    j--;
                }

        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String a = "ABCBDABfsdgsfdr";
        String b = "BDCABAr";
        int [][]result = lcs(a,b);
        print(result,a,b);
        System.out.println(result);
        getLcstring(a,b,result);
        System.out.println("-----end---");
    }

}
0 0 0 0 0 0 0 0 
0 0 0 0 1 1 1 1 
0 1 1 1 1 2 2 2 
0 1 1 2 2 2 2 2 
0 1 1 2 2 3 3 3 
0 1 2 2 2 3 3 3 
0 1 2 2 3 3 4 4 
0 1 2 2 3 4 4 4 
0 1 2 2 3 4 4 4 
0 1 2 2 3 4 4 4 
0 1 2 2 3 4 4 4 
0 1 2 2 3 4 4 4 
0 1 2 2 3 4 4 4 
0 1 2 2 3 4 4 4 
0 1 2 2 3 4 4 4 
0 1 2 2 3 4 4 5 
[[I@1db9742
element: r   i: 15 j: 7
element: A   i: 6 j: 6
element: B   i: 4 j: 5
element: C   i: 3 j: 3
element: B   i: 2 j: 1
-----end---

你可能感兴趣的:(java,LCS,最长公共子序列,DP)