DP(最长公共子串问题)

动态规划 最长公共子序列 过程图解 1.基本概念       首先需要科普一下,最长公共子序列(longest common sequence)和最长公共子串(longest common substring)不是一回事儿。什么是子序列呢?即一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果。什么是子串呢?给定串中任意个连续的字符组成的子序列称为该串的子串。给一个图再解释一下:        如 阅读详情
 最长公共子串问题:一个给定序列的子序列是在该序列中删去若干元素后得到的序列。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。最长公共子串就是求给定两个序列的一个最长公共子序列。例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列。
问题分析:
    给定两个序列A和B,称序列Z是A和B的公共子序列,是指Z同是A和B的子序列。问题要求已知两序列A和B的最长公共子序列。如采用列举A的所有子序列,并一一检查其是否又是B的子序列,并随时记录所发现的子序列,最终求出最长公共子序列。这种方法因耗时太多而不可取。
    考虑最长公共子序列问题如何分解成子问题,设A=“a0,a1,…,am-1”,B=“b0,b1,…,bm-1”,并Z=“z0,z1,…,zk-1”为它们的最长公共子序列。不难证明有以下性质:
(1) 如果am-1=bn-1,则zk-1=am-1=bn-1,且“z0,z1,…,zk-2”是“a0,a1,…,am-2”和“b0,b1,…,bn-2”的一个最长公共子序列;
(2) 如果am-1!=bn-1,则若zk-1!=am-1,蕴涵“z0,z1,…,zk-1”是“a0,a1,…,am-2”和“b0,b1,…,bn-1”的一个最长公共子序列;
(3) 如果am-1!=bn-1,则若zk-1!=bn-1,蕴涵“z0,z1,…,zk-1”是“a0,a1,…,am-1”和“b0,b1,…,bn-2”的一个最长公共子序列。
这样,在找A和B的公共子序列时,如有am-1=bn-1,则进一步解决一个子问题,找“a0,a1,…,am-2”和“b0,b1,…,bm-2”的一个 最长公共子序列;如果am-1!=bn-1,则要解决两个子问题,找出“a0,a1,…,am-2”和“b0,b1,…,bn-1”的一个最长公共子序列 和找出“a0,a1,…,am-1”和“b0,b1,…,bn-2”的一个最长公共子序列,再取两者中较长者作为A和B的最长公共子序列。
    为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法,具体说明如下。

定义c[i][j]为序列“a0,a1,…,ai-2”和“b0,b1,…,bj-1”的最长公共子序列的长度,计算c[i][j]可递归地表述如下:
(1)c[i][j] = 0                         如果i=0或j=0;
(2)c[i][j] = c[i-1][j-1]+1             如果i,j>0,且a[i-1] = b[j-1];
(3)c[i][j] = max{c[i][j-1], c[i-1][j]} 如果i,j>0,且a[i-1] != b[j-1]。
按此算式可写出计算两个序列的最长公共子序列的长度函数。由于c[i][j]的产生仅依赖于c[i-1][j-1]、c[i-1][j]和c[i][j-1],故可以从c[m][n]开始,跟踪c[i][j]的产生过程,逆向构造出最长公共子序列。
飞书多维表格省钱攻略:1个专业版账号,全员合规用、权限全掌控 像运动馆、 托管班、作业辅导、少儿美术、书法、口才班等等。对于大多数中小团队而言,飞书多维表格的核心需求是“协作高效、数据可控、成本可控”,而“1个专业版账号+多联系人”的模式,恰好完美契合这三点——既不用为不必要的席位付费,又能解锁全部专业功能,还能通过精细化权限管控保障数据安全。尤其是餐饮店、乒乓球训练馆这类个体经营或小型团队,人员分工清晰、权限需求明确,采用这种模式能最大化节省成本,同时提升管理效率。无需复杂的配置,无需额外的技术支持,5分钟就能搭建起全员协作的省钱体系。 阅读详情

相关推荐

运放+三极管恒流源电路计实战:从原理到仿真一步到位(附Multisim文件)

本文详细解析了运放与三极管构建恒流源电路的核心原理,重点阐述了负反馈机制如何实现精准的电流控制。通过Multisim仿真实战,从电路搭建、参数计算到负载调整率与动态响应分析,一步步指导计过程,并提供常见故障的调试技巧与PCB计要点,帮助工程师从理论平稳过渡到可靠实践。

7z8x2c4v6b9的博客 667

公共子序列

本文内容参考如下: 【1】 https://blog.csdn.net/lyy289065406/article/details/78702485; 【2】《算法导论》第3版 15.4节 最长公共子序列(longest common sequence):即一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果。 和最长公共子串(longest common substring):给定串中任意个连续的字符组成的子序列称为该串的子串。、 给一个图再解释一下: 2.动态规划 求解LCS问题

weixin_44368514的博客 3656

基于STM32F407ZGT6微控制器平台结合FreeRTOS实时操作系统与FATFS文件系统实现SD卡高速读写与文件管理的嵌入式系统开发项目_详细配置CubeMX的RCC时钟.zip

基于STM32F407ZGT6微控制器平台结合FreeRTOS实时操作系统与FATFS文件系统实现SD卡高速读写与文件管理的嵌入式系统开发项目_详细配置CubeMX的RCC时钟.zip

最长公共子序列问题(动态规划)

最长公共子序列问题 动态规划

m0_52124992的博客 8606

动态规划解最长公共子序列问题

动态规划法 经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。 为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。【问题】 求两字符序列的最长公共字符子序列 问

yysdsyl的专栏 18万+

最长公共子序列

问题描述: 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列<i0,i1,…,ik-1>,使得对所有的j=01,…,k-1,有xij=yj。例如,X=“ABCBDAB”,Y=“BCDB”是...

weixin_30337251的博客 117

DP-最长公共子串最长公共子串问题-OJ1148】

题目描述 所谓最长公共子串,比如串A "acedfe", 串B "aede", 则它们的最长公共子串为串 "aede", 即不论串中字符是否相邻,只要它是给定各个串都包含的,且长度最长的串。给定两个不包含空格的字符串和一整数n , 如果最长公共串长度大于或等于n,输出Not Smaller, 否则输出Smaller.   输入要求 第一行仅一个整数N,(1&amp;lt;= N &amp;lt;= 100...

zujiasheng的博客 594

dp经典问题——最长公共子串,子序列,以及一系列类似问题

学习来自这篇文章:动态规划经典——最长公共子序列问题 (LCS)最长公共子串问题 可以OJ的网站:[编程题]最长公共子序列 LCS:Longest Common Substring 最长公共子串问题 文章讲解的很清楚,主要要用dp数组,dp数组中存放的是长度为i的A串和长度为B的j串,它们两者之间的最长公共子串。所以就要看A[i-1]和B[j-1]相等不?如果相等,那么dp[i][j] =...

慢慢冲鸭子的博客 342

学习notes——DP解决最长公共子串问题

DP表是s1,s2索引分别向右,向下移动的结果,所以是i-1,j-1来对应dp表i,j处的字符。固定s1的某个字符不动直至s2的某个字符和它相等,相等长度+1

2501_93922910的博客 78

【数据结构】DP最长公共子串问题

给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一。 package collection; public class HashMapDemo01 { public static void main(String args[]) { System.out.println(DP( "d8Wt20lnSgAw0HgauN2Kspyr298H6wQWMO3tMNRpWmR25NNTD4VTnq16LX80khSMEG0W5V72cIDL

wlc19981111的博客 203

动态规划 dp03 最长公共子串问题 c代码

题目: 若序列Z是序列X的子序列,又是Y的子序列,则称Z是序列X与Y的公共子序列。例如序列"bcba"是序列"abcbdab""bdcaba"公共子序列。 例如,给出序列X "hahafdreghsbacdba"和序列"acdbegshbdrabsa",如何求取这两个序列的最长公共子序列? 这道题具有典型的最优子结构特性,即它的最优解一定包含子问题的最优解,这么看使用动态规划来解决是比较...

fuyuande的博客 573

关于序列DP问题的集合整理(内含:最长公共子序列,最长公共子串最长上升子序列,最长上升字串)

子串与子序列的区别(很重要的!!!字串子序列搞清楚之后,进入正题。

H68462的博客 582

【算法训练-动态规划 三】【双序列DP问题最长重复子数组、最长公共子串最长公共子序列、编辑距离

对于本题而言,可以定义dp[i][j]表示和的最长公共子序列。表示的是 text1 的 第 0 个元素到第 i - 1 个元素,两端都包含) 之所以dp[i][j]的定义不是text1[0:i]和text[0:j],是为了方便当 i = 0 或者 j = 0 的时候,dp[i][j]表示空字符串和另外一个字符串的匹配,这样dp[i][j]可以初始化为空字符串对于本题而言,可以定义dp[i][j]表示和的最长公共子序列。表示的是 text1 的 第 0 个元素到第 i - 1 个元素,两端都包含) 之所以。

MaoLin Tian's Blog 1089

最长公共子串(后缀数组)

 题目:http://poj.org/problem?id=2217 首先解释,DP中的最长公共子序列和此处的最长公共子串区别-------------------序列可以是不连续的,但是子串是连续的 其次,LCP,lcp[i]就是lcp[rank[i]]和lcp[rank[i]+1]的最长公共前缀,那么把两个字符串接起来,然后找最长的lcp,就是答案 思路还是比较清晰的

briup_acmer的专栏 788

DP-从基础题理解动态规划问题(3)(最长公共子串

二维数组用来记录每一个分别以字符串1为匹配串或以字符串2为匹配串的公共字符长度,可得到如下的动态转移方程:import java.util.*; public class 最长公共子串 { public static void main(String[] args) { Scanner in=new Scanner(System.in); //输入两个字符串 String s1=in...

代码屋-CODE HOUSE 353

对于最长公共子序列的理解。

解决LCS问题,需要把原问题分解成若干个子问题,所以需要刻画LCS的特征。 A=“a0,a1,…,am”,B=“b0,b1,…,bn”,且Z=“z0,z1,…,zk”为它们的最长公共子序列。不难证明有以下性质: 如果am=bn,则zk=am=bn,且“z0,z1,…,z(k-1)”是“a0,a1,…,a(m-1)”和“b0,b1,…,b(n-1)”的一个最长公共子序...

weixin_34368949的博客 161

【LeetCode】LCS最长公共子序列

最长公共子序列题目描述思路分析递归结构算法实现输出最长子序列算法实现 题目描述 思路分析 A=“a0,a1,…,am”,B=“b0,b1,…,bn”,且Z=“z0,z1,…,zk”为它们的最长公共子序列。不难证明有以下性质: 如果am=bn,则zk=am=bn,且“z0,z1,…,z(k-1)”是“a0,a1,…,a(m-1)”和“b0,b1,…,b(n-1)”的一个最长公共子序列; 如果am!=bn,则若zk!=am,蕴涵“z0,z1,…,zk”是“a0,a1,…,a(m-1)”和“b0,b1,…,b

allensu374125056的博客 623

动态规划经典案例

1.最长递增子序列 求一段字符串的最长递增子序列 问题分析: 序列为:A="a0,a1,a2,a3,a4,a5,...,ai",定义D(i)为选i作为序列一项后,后面序列中第i项更大项数有多少,包括i.从最后一项算起D(i)=1,依次往前计算;如果akak+1 ,则往后遍历,直到寻找到m,ak 举例 A={1,5,2,6,3,4} 算出:D=(4,2,3,1,2,1)最长子序列

thaedi1024的专栏 838

算法笔记 //12_最长公共子序列问题(动态规划算法)

一、问题描述: 最长公共子序列问题: 给定两个序列 X = {x1, x2,x3,....,xm} 和 Y = {y1,y2,y3,....,yn} ,找出 X 和 Y 的最长公共子序列。 二、动态规划算法思想: 求解LCS问题,不能使用暴力搜索方法。一个长度为n的序列拥有 2的n次方个子序列,它的时间复杂度是指数阶,太恐怖了。解决LCS问题,需要借助动态规划的思想。 动态规划算法

VI___ 967

程序员面试100题之六:最长公共子序列

题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。       例如:输入两个字符串

Hackbuteer1的专栏 3万+

最长公共子字序列和最长公共子字符串

最长公共子串(Longest CommonSubstring)和最长公共子序列(LongestCommon Subsequence, LCS)的区别:子串(Substring)是串的一个连续的部分,子序列(Subsequence)则是从不改变序列的顺序,而从序列中去掉任意的元素而获得的新序列;更简略地说,前者(子串)的字符的位置必须连续,后者(子序列LCS)则不必。比如字符串acdfg同akdfc

785
上一篇: hdu2059龟兔赛跑
下一篇: hduDP题(思路)
a1647566717
博客等级 码龄15年 15粉丝 74原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值