最长公共子序列

来源:互联网 发布:南京听说科技软件下载 编辑:程序博客网 时间:2024/06/15 00:02

公式:


代码:

// SubSequence    public static void LCS(String s1, String s2) {        int[][] matrix = new int[s1.length() + 1][s2.length() + 1];        String[][] flags = new String[s1.length() + 1][s2.length() + 1];        for (int i = 0; i <= s1.length(); i++)            matrix[i][0] = 0;        for (int j = 0; j <= s2.length(); j++)            matrix[0][j] = 0;        for (int i = 1; i <= s1.length(); i++) {            for (int j = 1; j <= s2.length(); j++) {                if (s1.charAt(i - 1) == s2.charAt(j - 1)) {                    matrix[i][j] = matrix[i - 1][j - 1] + 1;                    flags[i][j] = "2";                } else {                    if (matrix[i - 1][j] >= matrix[i][j - 1]) {                        matrix[i][j] = matrix[i - 1][j];                        flags[i][j] = "0";                    } else {                        matrix[i][j] = matrix[i][j - 1];                        flags[i][j] = "1";                    }                }            }        }        // print max length        System.out.println(matrix[s1.length()][s2.length()]);        // print subsequence        Character[] s = new Character[matrix[s1.length()][s2.length()]];        int k = matrix[s1.length()][s2.length()];        int i = s1.length();        int j = s2.length();        while (i > 0 && j > 0) {            if (flags[i][j].equals("2")) {                s[--k] = s2.charAt(j - 1);                i--;                j--;            } else {                if (flags[i][j].equals("1")) {                    j--;                } else {                    i--;                }            }        }        for (Character c : s) {            System.out.print(c);        }    }

0 0