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

Longest Common Subsequence (LCS)最长公共子串

Longest CommonSubsequence (LCS). The following are some instances. a)      X: xzyzzyx   Y: zxyyzxz b...
  • chenguibao
  • chenguibao
  • 2015年07月01日 14:31
  • 605

动态规划 (Dynamic Programming) 之 最长公共子序列(Longest Common Subsequence)

这个问题也是算法导论上提过的问题。注意这个问题是Subsequence不是Substring。substring的话就是子串,子串的要求的连续相等的字符序列,而subsequence不要求连续。比如说...
  • hhygcy
  • hhygcy
  • 2009年03月02日 11:20
  • 11522

LCS(Longest Common Sequence)最长公共子序列算法

LCS(Longest Common Sequence)最长公共子序列算法最长公共子序列就是在两个字符串中找出相同且最长的子序列,其中该子序列并不要求是连续的。假设我们拥有两个序列S1S_1和S2S_...
  • batuwuhanpei
  • batuwuhanpei
  • 2016年08月22日 10:14
  • 721

longest common sequence(最长公共子序列)

参考博客:http://blog.csdn.net/u012150590/article/details/51474731
  • github_38818603
  • github_38818603
  • 2017年05月26日 11:30
  • 90

最长公共子序列LongestCommonSubsequence

最长公共子序列,是求两个子序列中最长的不连续字符串,可以采用动态规划的方法求解。 假设字符串X=“aebfd”  Y=“abefkd” ,求X和Y的最长公共子序列 步骤如下: 一、先构造一个二维...
  • Shava_Shaw
  • Shava_Shaw
  • 2016年01月20日 14:11
  • 147

算法导论29(线性规划)

29.1 标准型和松弛型标准型: maximize:∑j=1ncjxjsubjectto:∑j=1naijxj≤bi,i=1,2,⋯,mxj≥0,j=1,2,⋯,n\begin{array}{l} ...
  • hz5034
  • hz5034
  • 2015年06月30日 15:29
  • 1094

[leetcode]longest consecutive sequence(java)

问题描述: Given an unsorted array of integers, find the length of the longest consecutive elements sequ...
  • zdavb
  • zdavb
  • 2015年07月05日 22:25
  • 412

Longest Common Prefix--LeetCode

题目: Write a function to find the longest common prefix string amongst an array of strings. 思路:查找最长的通...
  • yusiguyuan
  • yusiguyuan
  • 2015年04月01日 11:48
  • 446

算法导论第十一章----11.2.1-11.2.5

11.2-1& 随机变量Xij表示i,j哈希值相同 11.2-3 search(successful or unsuccessful): Θ(1+α/2) insert: Θ(1+...
  • lihenair
  • lihenair
  • 2014年02月27日 20:05
  • 4810

算法导论示例-InsertSort

/** * Introduction to Algorithms, Second Edition * 2.1 InsertSort * @author 土豆爸爸 * */public class ...
  • s3n
  • s3n
  • 2006年06月02日 22:00
  • 720
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法导论示例-LongestCommonSubsequence
举报原因:
原因补充:

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