第11章:最长公共子序列(LCS:Longest Common Subsequence)
方法:动态规划 《算法导论》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)的更多相关文章
- 动态规划之最长公共子序列LCS(Longest Common Subsequence)
一.问题描述 由于最长公共子序列LCS是一个比较经典的问题,主要是采用动态规划(DP)算法去实现,理论方面的讲述也非常详尽,本文重点是程序的实现部分,所以理论方面的解释主要看这篇博客:http://b ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 动态规划 ---- 最长公共子序列(Longest Common Subsequence, LCS)
分析: 完整代码: // 最长公共子序列 #include <stdio.h> #include <algorithm> using namespace std; ; char ...
- (最长公共子序列 暴力) Common Subsequence (poj 1458)
http://poj.org/problem?id=1458 Description A subsequence of a given sequence is the given sequence w ...
- 动态规划——最长公共子序列LCS及模板
摘自 https://www.cnblogs.com/hapjin/p/5572483.html 这位大佬写的对理解DP也很有帮助,我就直接摘抄过来了,代码部分来自我做过的题 一,问题描述 给定两个字 ...
- 1006 最长公共子序列Lcs
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdks ...
- 编程算法 - 最长公共子序列(LCS) 代码(C)
最长公共子序列(LCS) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定两个字符串s,t, 求出这两个字符串最长的公共子序列的长度. 字符 ...
- C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解
版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...
- POJ 1458 Common Subsequence(最长公共子序列LCS)
POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...
- 51Nod 1006:最长公共子序列Lcs(打印LCS)
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
随机推荐
- When an HTTP server receives a request for a CGI script
cgicc: Overview of the Common Gateway Interface https://www.gnu.org/software/cgicc/doc/cgi_overview. ...
- mysqld.sock
sudo service mysql start https://dev.mysql.com/doc/refman/5.7/en/problems-with-mysql-sock.html B.5. ...
- Spring Data 关于Repository的介绍(四)
Repository类的定义: public interface Repository<T, ID extends Serializable> { } 1)Repository是一个空接口 ...
- 模块 - random/string/os/sys/shutil/zipfile/tarfile
random 模块 方法: >>> random.randint(1,3) #会包含 1 2 3 3 >>> random.randrange(1,3) #会包含 ...
- centos7 Dockerfile安装nginx
1.写一个Dockerfile文件 FROM centos MAINTAINER apeng apeng@apenglinux-002.com RUN yum install -y pcre-deve ...
- pycharm调试
pycharm调试 flask app调试: 1.打开edit configurations面板 run===>edit configurations(图一或图二处都可以) 2.配置项目信息 点 ...
- javascript教程5:--BOM操作
1.BOM 简介 所谓的 BOM 即浏览器对象模型(Browser Object Model).BOM 赋予了 JS 操作浏览器的能力,即 window 操作.DOM 则用于创建删除节点,操作 HTM ...
- django--博客系统--后台管理
1.后台管理功能主要实现了,文章的添加与修改,以及富文本的使用 前端页面 母版 <!DOCTYPE html> <html lang="en"> <h ...
- python中decorator的用法及原理(一)
0. 概念 什么叫装饰器,其实也可以叫做包装器.即对于一个既有的函数func(args),在调用它之前和之后,我们希望都做一些事情,把这个函数包装起来. Python中的装饰器分为两类:函数装饰器和类 ...
- 数据库、Java与Hibernate数据类型对照
数据类型对照表: 标准SQL数据类型 Java数据类型 Hibernate数据类型 TINYINT byte.java.lang.Byte byte SMALLINT short.java.lang. ...