算法导论示例-LongestCommonSubsequence

来源:互联网 发布:淘宝御泥坊旗舰店 编辑:程序博客网 时间:2024/05/07 04:48
/** * Introduction to Algorithms, Second Edition  * 15.4 Longest common subsequence * @author 土豆爸爸 *  */public class LongestCommonSubsequence {    /**     * 求两个字符串的最长公共子序列     * @param x 字符串x     * @param y 字符串y     * @return 两个字符串的最长公共子序列     */    public static String lcs(String x, String y) {        int m = x.length();        int n = y.length();        int[][] c = new int[m + 1][n + 1]; //构建计算矩阵        for(int i = 1; i <= m; i++) {            for(int j = 1; j <= n; j++) {                if(x.charAt(i-1) == y.charAt(j-1)) { //如果相同右下                    c[i][j] = c[i-1][j-1] + 1;                } else if(c[i-1][j] >= c[i][j-1]) { //向大的方向移动                    c[i][j] = c[i-1][j];                } else {                    c[i][j] = c[i][j-1];                }            }        }        return output(x, y, c, m, n).toString();    }        /**     * 迭代输出.     * @param x 字符串x     * @param y 字符串y     * @param c 计算矩阵     * @param i 行索引     * @param j 列索引     * @return 输出最长公共子序列     */    private static StringBuilder output(String x, String y, int[][] c, int i, int j) {        if(i == 0 || j == 0) {            return new StringBuilder();        }         if(x.charAt(i-1) == y.charAt(j-1)) {            return output(x, y, c, i-1, j-1).append(x.charAt(i-1));        } else if (c[i][j] == c[i-1][j]) {            return output(x, y, c, i-1, j);        } else {            return output(x, y, c, i, j-1);        }    }}import junit.framework.TestCase;public class LongestCommonSubsequenceTest extends TestCase {    public void testLcm() {        assertEquals("BCBA", LongestCommonSubsequence.lcs("ABCBDAB", "BDCABA"));    }}