最长公共子序列

来源:互联网 发布:灰鸽子软件下载 编辑:程序博客网 时间:2024/06/06 20:38

一个给定序列的子序列是在该序列中删去若干元素后得到的序列
给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列
最长公共子序列
X = (A, B, C, B, D, A, B) Y = (B, D, C, A, B, A)
(B, C, B, A) (B, D, A, B)

完全代码

package org.fan.learn.dp;/** * Created by fan on 2016/9/14. */public class MaxPublicSubsequence {    public static int[][] result;    public static final char[] A = {'C','A','B','D','B','C','A','B'};    public static final char[] B = {'C','B','D','C','A','B','C','B','E'};    public static int searchDigui(int idxA, int idxB) {        if (idxA < 0 || idxB < 0) {            return 0;        }        int a = 0, b = 0, c = 0;        if (A[idxA] == B[idxB]) {            a = searchDigui(idxA-1, idxB-1) + 1;        }        b = searchDigui(idxA-1, idxB);        c = searchDigui(idxA, idxB - 1);        return Math.max(Math.max(a,b),c);    }    //记忆化搜索    public static int searchDiguiYouhua(int idxA, int idxB) {        if (idxA < 0 || idxB < 0) {            return 0;        }        if (result[idxA][idxB] >= 0) {            return result[idxA][idxB];        }        int a = 0, b = 0, c = 0;        if (A[idxA] == B[idxB]) {            a = searchDiguiYouhua(idxA - 1, idxB - 1) + 1;        }        b = searchDiguiYouhua(idxA-1, idxB);        c = searchDiguiYouhua(idxA, idxB - 1);        result[idxA][idxB] = Math.max(Math.max(a, b), c);        return result[idxA][idxB];    }    public static int searchDitui(int idxA, int idxB) {        int a = 0, b = 0, c = 0;        //初始化值        for (int j = 0; j < B.length; j++) {            if (A[0] == B[j]) {                result[0][j] = 1;            }        }        for (int i = 1; i < A.length; i++) {            if (A[i] == B[0]) {                result[i][0] = 1;            }            for (int j = 1; j < B.length; j++) {                if (A[i] == B[j]) {                    a = result[i-1][j-1] + 1;                }                b = result[i-1][j];                c = result[i][j-1];                result[i][j] = Math.max(Math.max(a, b), c);            }        }        return result[idxA][idxB];    }    public static void main(String[] args) {        result = new int[A.length][B.length];        for (int i = 0; i < A.length; i++) {            for (int j = 0; j < B.length; j++) {                result[i][j] = -1;            }        }        System.out.println(searchDigui(A.length - 1, B.length - 1));        System.out.println(searchDiguiYouhua(A.length-1, B.length-1));        for (int i = 0; i < A.length; i++) {            for (int j = 0; j < B.length; j++) {                result[i][j] = -1;            }        }        System.out.println(searchDitui(A.length-1, B.length-1));    }}
0 0