算法导论示例-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")); }}