方法:动态规划 《算法导论》P208

最优子结构 + 重叠子问题

设xi,yi,为前i个数(前缀)

设c[i,j]为xi,yi的LCS的长度

c[i,j] = 0 (i ==0 || j == 0)

c[i,j] = a[i-1,j-1] + 1 (i,j>0 &&xi=yi)

c[i,j] = max(c[i,j-1],c[i-1,j])

求LCS(Xm-1 , Y)的长度与LCS(X , Yn-1)的长度,这两 个问题不是相互独立的:两者都需要求LCS(Xm-1,Yn-1)的长度。

【最长公共子序列的结构】

设序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的一个最长公共子序列Z=<z1, z2, …, zk>,

则:

1. 若xm=yn,则zk=xm=yn 且Zk-1 是Xm-1 和Yn-1 的最长公共子序列;

2. 若xm≠yn 且zk≠xm ,则Z 是Xm-1 和Y 的最长公共子序列;

3. 若xm≠yn 且zk≠yn ,则Z 是X 和Yn-1 的最长公共子序列。

由此递归结构容易看到最长公共子序列问题具有子问题重叠性质。

由于在所考虑的子问题空间中,总共只有θ(m*n)个不同的 子问题,因此,用动态规划算法自底向上地计算最优值能提高算法的效率。

【编码实现】

输出两个数组c[0..m ,0..n]和b[1..m ,1..n]。其中c[i,j]存储

Xi 与Yj 的最长公共子序列的长度,b[i,j]记录指示c[i,j]的值是由哪一个子问题的解达到的,

这在构造最长公共子序列时要用到。最后,X 和Y 的最长公共子序列的长度记录于c[m,n]

中。

【相似的解决方法:构造矩阵】

import java.util.Random;

public class LCS{

public static void main(String[] args){

int substringLength1 = 20;

int substringLength2 = 20;

String x = GetRandomStrings(substringLength1);

String y = GetRandomStrings(substringLength2);

Long startTime = System.nanoTime();

int[][] opt = new int[substringLength1 + 1][substringLength2 + 1];

for(int i = substringLength1 - 1;i>=0;i--){

for(int j =substring2 -1;j>=0;j--){

if(x.charAt(i) =  y.charAt(j))

opt[i][j] = opt[i+1][j+1] + 1;

else

opt[i][j] = Math.max(opt[i+1][j],opt[i][j+1]);

}

}

System.out.println("substring1:"+x);

System.out.println("substring2:"+y);

System.out.print("LCS:");

int i = 0, j = 0;

while (i < substringLength1 && j < substringLength2){

if (x.charAt(i) == y.charAt(j)){

System.out.print(x.charAt(i));

i++;

j++;

} else if (opt[i + 1][j] >= opt[i][j + 1])

i++;

else

j++;

}

Long endTime = System.nanoTime();

}

}

第11章:最长公共子序列(LCS:Longest Common Subsequence)的更多相关文章

  1. 动态规划之最长公共子序列LCS(Longest Common Subsequence)

    一.问题描述 由于最长公共子序列LCS是一个比较经典的问题,主要是采用动态规划(DP)算法去实现,理论方面的讲述也非常详尽,本文重点是程序的实现部分,所以理论方面的解释主要看这篇博客:http://b ...

  2. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  3. 动态规划 ---- 最长公共子序列(Longest Common Subsequence, LCS)

    分析: 完整代码: // 最长公共子序列 #include <stdio.h> #include <algorithm> using namespace std; ; char ...

  4. (最长公共子序列 暴力) Common Subsequence (poj 1458)

    http://poj.org/problem?id=1458 Description A subsequence of a given sequence is the given sequence w ...

  5. 动态规划——最长公共子序列LCS及模板

    摘自 https://www.cnblogs.com/hapjin/p/5572483.html 这位大佬写的对理解DP也很有帮助,我就直接摘抄过来了,代码部分来自我做过的题 一,问题描述 给定两个字 ...

  6. 1006 最长公共子序列Lcs

    1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdks ...

  7. 编程算法 - 最长公共子序列(LCS) 代码(C)

    最长公共子序列(LCS) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定两个字符串s,t, 求出这两个字符串最长的公共子序列的长度. 字符 ...

  8. C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解

    版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...

  9. POJ 1458 Common Subsequence(最长公共子序列LCS)

    POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...

  10. 51Nod 1006:最长公共子序列Lcs(打印LCS)

    1006 最长公共子序列Lcs  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...

随机推荐

  1. Linux磁盘管理命令(fdisk,mount,umount,mkfs)

    查看磁盘:fdisk -l 一块磁盘可以分14个分区 [root@wendyhost ~]# fdisk -l Disk /dev/sda: 64.4 GB, 64424509440 bytes 25 ...

  2. mysql ErrorNo:1449

    ErrorMsg:The user specified as a definer ('root'@'%') does not exist解决方法:权限问题,授权 给 root 所有sql 权限 mys ...

  3. 科学计算 NumPy 与C语言对比 N-dimensional array ndarray 元素元素操作 计算正太分布分位数

    w http://www.numpy.org/ NumPy is the fundamental package for scientific computing with Python. It co ...

  4. linux运维 vi vim q 的间接注释

    w q  --不发生写的写,无增删效果. 点q后,再次执行 vi /var/www/share/w.php 仍然会‘ Found a swap file by the name "/var/ ...

  5. PHP数组遍历详解

    一.PHP数组简介 1.PHP数组的分类 按照下标的不同分为关联数组和索引数组①索引数组:下标从0开始依次增长②关联数组:下标为字符串格式,每个下标字符串与数组的值一一对应,(有点像对象的键值对) 下 ...

  6. [设计模式]迭代子模式 Iterator

    迭代子模式又叫做游标cursor模式,是对象的行为模式.迭代子模式可以顺序的访问一个聚集中的元素而不必暴露聚集的内部表象. 迭代子模式被广泛的应用在Java语言的API中的几个设计模式之一.在Java ...

  7. AngularJS 笔记之创建服务方式比较 : factory vs service vs provider 。

    首先说一下服务这个东西是用来干嘛的.很多时候我们把太多的数据和逻辑都一股脑儿地往 controller 里放.这样我们的 controller 原来越臃肿.从它们的生命周期可以发现,其实 contro ...

  8. 我们为什么使用ORM

    我们为什么使用ORM? http://www.cnblogs.com/tansm/archive/2006/06/07/419927.html 博客园在推广ORM方面的确做了很大的贡献,很多的程序员开 ...

  9. HDOJ 1159 Common Subsequence【DP】

    HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...

  10. flex graphiclar symbol的不同比例尺切换

    private var cityGraL:GraphicsLayer;//标记城市 maxScale=50000 private var siteGraL:GraphicsLayer;//标记站点 m ...