算法导论示例-LongestCommonSubsequence

原创 2006年06月16日 00:19:00
/**
 * 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"));
    }
}

相关文章推荐

链式哈希表(Hash Table)--算法导论示例

In computer science, a hash table is an associative array data structure that associates keys with v...

【算法导论】最大子数组问题(递归+迭代)

最大子数组问题。首先考虑习题4-15,要求迭代实现,线性复杂度,首先直接上代码:import java.lang.reflect.Array; import java.util.Arrays;publ...

堆排序(C#,C++)算法导论

  • 2017年10月11日 10:50
  • 3.21MB
  • 下载

算法导论22.4拓扑排序 练习总结

22.4-1 给出算法 TOPOLOGICAL-SORT 运行于图 22-8 上时所生成的结点次序。这里的所有假设和练习 22.3-2 一样。 ANSWER: 22.4-2 请给出一个线性时间的算...
  • chan15
  • chan15
  • 2015年12月29日 12:57
  • 6879

USTCer 算法导论 字符串匹配实验

  • 2017年10月10日 11:52
  • 424KB
  • 下载

算法导论-第3版

  • 2017年11月02日 13:46
  • 99.01MB
  • 下载

看《算法导论》的一点感想

说实话,我没把那书看完,甚至没有看过1/10,至于做题就更没谱了,只要不是有人提起,我根本不知道哪个题居然在算导(下文简写成clrs)中出现过,但是我还要写一下我对这书的心得,看法和感受,尤其是和找工...
  • idwtwt
  • idwtwt
  • 2014年12月24日 00:44
  • 3553
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法导论示例-LongestCommonSubsequence
举报原因:
原因补充:

(最多只允许输入30个字)