最长公共子序列&最长公共子串

动态规划 之 最长公共子序列问题 下面这篇文章介绍一下在算法设计中动态规划的最长公共子序列的问题。 最长公共子序列问题所谓,也即是分别给出长度为nm的字符串A,B,然后找出其中最长公共子序列最优最优解。 所谓最优,也就是求出这个最长公共子序列的长度;而最优解,就是要求出这个最长最长公共子序列是什么的问题。给个不太恰当的例子:我们中学数学中经常会遇到求函数最的问题,比如说求出函数 f(x) 的最大,那么这个最大 阅读详情

最长公共子序列

1、算法的定义

最长公共子序列(LCS)问题是分别给出长度为i和j的字符串想X,Y,然后找出其中最长公共子序列的最优值和最优解。

2、算法的理解

1)由于最长公共子序列问题属于动态规划问题,所以在求解的时候需要对其分析相关的状态,

       总结出状态转移方程。逆向思维从结果到过程的思考分析。

2)对于当前问题的状态分析如下

  1.  假设LCS序列Z长度为k
  1. 当字符串X或者Y的长度为0时(I 或者j为0),LCS序列Z(k) = 0
  1. 当X(i)=Y(j)时, Z(k) = X(i)=Y(j) ,所以它们的最后一个字符是相等的。此时必然 会存在Z(k-1)∈X(i-1)   或者 Z(k-1)∈Y(j-1),所以L[i. j] 与L[i-1,j-1]相差1, 即L[i, j] = L[i-1,j-1]+1
  1.  当X(i) !=Y(j)时 Z(k) ∈X(m<=i) 或Z(k) ∈Y (n<=j)( m与n不相等),此时的Z中的K值  必然存在于max{m,n}中。   根据以上信息得到:LCS([I, o] >= LCS[m , o]   和  LCS([o, j]>= LCS[o , n]。即:L[ i ,j] = max{ L[i-1 , j] , L[ I , j-1] }
  1.  总结得到如下的状态转移方程

3、算法实现

4、实现解析

假设两个字符串A为”ABCBDAB” B为“BDCABA”,需要写的二维表为L[8][7]。

a)        第一个for循环填写表中第一列,初始值都为0;

b)        第二个for循环填写表中第一行,初始值都为0;

c)        接下来两个嵌套循环用于填表( ==  或者 != 的情况)填表结果如下:L[7][6]为LCS的值。

*在获取所有符合当前LCS值得公共子序列时,需要记录利用回溯法,递归的遍历当前问题到子问题的路径。用一个track[8][7]数组记录

  所有公共子串:BDAB BCAB BCBA(主要看斜对角线上的值)

最长公共子串的求解:

1.   两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。采用一个二维数组来存储中间结果。

2.   假设两个字符串分别是:A=”baba”B=”caba”i代表A字符串的当前位置, j代表B当前字符串的位置,当 == 时,对应的元素值为1 ,否则为0,。生成如下表:

3.  斜对角线上值为1的字符组成的字符串为公共子串,最长的为最长公共子串(aba)。

²  算法改进:

由于在搜索最长公共子串时需要花费大量的时间,所以当 == 时,对应的元素值为T[i-1][j-1]+1,否则为0。生成结果如下表:


【LeetCode】最长公共子串&最长公共子序列 子序列与子串的区别: 假设有S1 = “abcdeffg” S2 = "abcfg" 子串:“abc” 子序列:“abcfg” 简单的说,子串就是需要连续,子序列不需要连续。 题目1:子串 可能我这么说不严谨,其实718题是子数组,但意思是一样的,都是需要找连续的。 718. 最长重复子数组 给两个整数数组AB,返回两个数组中公共的、长度最长的子数组的长度。 示例 1:... 阅读详情

相关推荐

详解最长公共子序列问题(三种方法)

C++分别利用三种动态规划解决最长公共子序列问题

CXR_XC的博客 1万+

最长公共子序列最优最优解递归算法

代码部分: #include&lt;iostream&gt; using namespace std; char X[100];//存放X序列的数组 char Y[100];//存放Y序列 int c[100][100];//存放公共子序列个数的二维表 int b[100][100];//存放标志位,用来后面找最优解的二维表 int lcs_length(int m, int n) { for (int i = 1; i &lt;= m; i++) c[i][0] = 0;//当某一个...

weixin_57609817的博客 1517

算法:动态规划——最长公共子序列

文章目录一、动态规划概念1. 动态规划步骤最长公共子序列问题题目示例分析代码(递归)查表打印最长公共子序列 一、动态规划概念 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法解这类问题,则分解得到的子问题数目太多,以至于最后解决原问题需要耗费指数时间。 然而,不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多

Sauron7i的博客 7081

最长公共子序列-动态规划

定义描述  若给定序列X={x1x_1x1​,x2x_2x2​,…,xmx_mxm​},则另一序列Z={z1z_1z1​,z2z_2z2​,…,zkz_kzk​} 是X的子序列,是指存在一个严格递增下标序列{i1i_1i1​,i2i_2i2​,…,iki_kik​}使得对于所有j=1,2,…,k有:zjz_jzj​ = xijx_{i_j}xij​​ 。  例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}  给定2个序列XY,当另

迷雾总会解 2661

最长公共子序列(详细代码 注释 分析 以及求出最长公共子序列内容方法)

最长公共子序列 文章有些长,希望能够耐心看完,并且对你有帮助,文章是自己看了书之后,总结的,如果有什么错误的地方,欢迎指出。 一些基本的概念: 子序列: 原序列中删除若干个元素得到的序列,即原序列中可以不连续的一段 子串: 原序列中任意个连续的序列元素组成的序列,即原序列中必须连续的一段。 (两者的元素顺序必须原序列中的顺序一样) 最长公共子序列: 一个序列即是X序列的子序列,也是Y序列的子序列,则该序列称为为XY的公共子序列。对于两个序列的公共子序列是不唯一的,因此,最长公共子序列顾名思义就是长度

Bananaaay的博客 1万+

最优解-最长公共子序列

最长公共子序列(Longest Common Subsequence,LCS)即求两个序列最长公共子序列(可以不连续)。比如3 2 1 4 51 2 3 4 5两个序列,最长公共子序列为2 4 5 长度为3。从右下角开始,如果有dp[i][j]==dp[i-1][j-1]+1则往左上走一格。=b[j], 则 L[i][j]=max (L[i][j-1],L[i-1][j])若a[i]=b[j], 则 L[i][j]=L[i-1][j-1] +1。即:相同的取左上加1,不同取上左中的最大

忧郁王子的专栏 679

最长公共子序列 & 最长公共子串

1.区别找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。而最长公共子序列则并不要求连续。2、最长公共子串其实这是一个序贯决策问题,可以用动态规划来求解。我们采用一个二维矩阵来记录中间的结果。这个二维矩阵怎么构造呢?直接举个例子吧:&quot;bab&quot;&quot;caba&quot;(当然我们现在一眼就可以看出来最长公共子串&quot;ba&quot;或&quot;ab&quot;)   b  a  bc  0  0  0a  0  1  0b  1...

benjamin.li的小屋 270

LCS 最长公共子序列&最长公共子串

来源于我的博客最长公共子序列&最长公共子串这段时间刷(shui)题遇到最多就是回文子串、排列组合、快速排序了。最长公共子序列(Longest Common Subsequence)即找两个字符串相同的字串子序列,不要求连续。例如:==w e i m== i ==n g== l o w || str1 长度ml o ==w== i ==e i m n g== || str2 长度n用动态规划来解 考

520

动态规划:最长公共子串 & 最长公共子序列

一、最长公共子串 1. 题目 给定两个序列 X Y,如果 Z 即是 X 的子串,又是 Y 的子串,我们就称它是 X Y 的公共子串,注意子串是连续的。 例如 X = { A, B, C, D, E, F, G },Y = { A, B, Z, D, E, F, K, G },那么它们最长公共子串即 { D, E, F } 2. 思路 借助一下《图解算法》中的例子。假设对于两个字符串 fi...

阿飞的博客 1万+

java 动态规划求解最长公共子序列&最长公共子串问题

1、先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。而最长公共子序列则并不要求连续。 2、最长公共子序列 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列X=“x0,x1,…,xm- 1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X

ivan_ting的专栏 924

【动态规划】最长公共子序列&最长公共子串

最长公共子序列 参考:最长子序列 最长公共子串 参考添加链接描述 void findMaxCommonStr(string s1, string s2) { if (s1.length()&gt;s2.length()) swap(s1, s2);//s1用于保存较短的子串 int len1 = s1.length(), len2 = s2.length(); int maxLen = ...

革命尚未成功的兔子的博客 152

最长公共子串 & 最长公共子序列

最长公共子串(Longest-Common-Substring,LCS)   dp[i][j]:表示strA[0-i]与strB[0-j]的最长公共子串长度 如果 strA[i] !=  strB[j],dp[i][j] = 0; 如果 strA[i] == strB[j],dp[i][j] = dp[i-1][j-1] +1; 初始化: 如果strA[i] == strB[j],i=

marshalDyoung的专栏 689

【动态规划】最长公共子序列

4.根据计算最优时得到的信息,构造最优解。1.找出最优解性质,并刻画其结构特征。3.以自底向上的方式计算最优。2.递归定义最优

weixin_52958292的博客 540

最长公共子序列问题(Longest Common Sequence)及优化

@[TOC](最长公共子序列问题(Longest Common Sequence)及优化) 最长公共子序列问题(Longest Common Sequence)及优化 问题描述 给两个序列,找到最长的子序列的长度(LCS)。 注意:一个子序列子字符串不同,前者并不需要连续的原始序列。例如:对于“ABCD”“AEFC”,它们的最长公共子序列(LCS)是“AC”,长度为2。 解答 有两个序列ST...

apohgpurewn的博客 903

动态规划-最长公共子序列

问题描述: 给定两个序列,找出XY的一个最长公共子序列。 算法分析: 暴力法: X有2^m个子序列,逐个匹配Y的子序列。 动态规划法: (1)分析最优解的结构特征: 假设是XY的最长公共子序列。 证明:最优解包含局部最优解。 ①,是最长公共子序列。 若不是,设M是,则,但,矛盾! ②,去掉,则是最长公共子序列。 如果不是,设M是,则,在后+,则M也是...

HeinSven的博客 687

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

//萌新,今天自学了动态规划算法,下面这是一个最长公共子序列的问 //题 #include&lt;stdio.h&gt; #include&lt;string.h&gt; int b[100][100],c[100][100]; char a1[100],a2[100];//定义两个字符串数组; void print(int i,int j) { if(i0||j0)//i=0或者j=0说明回溯完...

liujiqing123的博客 789
下一篇: 在Django 1.5 中 Django Step by Step (九)教程分页实现方法的修正
pointerIsNULL
博客等级 码龄15年 1粉丝 15原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值