首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

算法:最长公共子序列(LCS)

先看几个概念 字符子串:指的是字符串中连续的n个字符,如abcdefg中,ab、cde、fg 都是它的子串。...字符子序列:指的是字符串中不一定连续但先后顺序一致的n个字符,即可以去掉字符串中的部分字符,但不可改变其前后顺序。如abcdefg中,acdg、bdf 是它的子序列,而bac、dbfg则不是。...公共子序列:如果序列 C 既是序列 A 的子序列,同时也是序列 B 的子序列,则称它为序列 A 和序列 B 的公共子序列。...LCS 是 Longest Common Subsequence 的缩写,即最长公共子序列。一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列。...注:LCS 不一定是唯一的,但长度是一定的。 例如:CTCA、TCGA 都是字符串 CATCGA 和字符串 GTACCGTCA 的 LCS。 2. 基本策略 ? ... 传说中的 ...

2K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    最长公共子串(注意子串是连续的) 1、先建立一个二维数组array[str1.size()][str2.size()](全部初始化为0),初始化第一行和第一列(元素相同处置1),然后进入状态方程 2、状态转移方程...) 示意(图中的公共子序列为"abde",注意我的程序是左面的和上面的相同的情况下,优先左,当然也可以是上): ?...1 /* 2 本程序说明: 3 4 最长公共子序列 5 6 */ 7 #include 8 #include 9 #include <string...1 /* 2 本程序说明: 3 4 最长公共子序列(加上了其中一个子序列的打印功能,回溯法) 5 6 */ 7 #include 8 #include 序列的和, 27 //剩下要插入的数字之和就是原数组的和减去公共子序列的和 28 vector> dp(n+1,vector

    2.6K31

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

    最长公共子序列 举个例子:s1="abcfde",s2="bcde"。那么s1与s2的最长公共子序列就是"bcde",注意不要求连续。该问题是典型的动态规划问题。...(i, j)从0开始,那么递推关系很容易找到:(maxLen(i,j)表示s1字符串左边i个字符构成的子串与s2左边j个字符构成的子串的最长公共子序列长度,下同) if(s1[i-1] == s2[j-...最长公共子串与上述最长公共子序列不一样,最长公共子串要求连续。...例如s1="asdfddsx",s2="asssdfed",那么s1与s2的最长公共子串是:"sdf"。...最长公共子串的输出比上面最长公共子序列简单,因为后者一定是连续的,我们只要保存最后一个两个字符串字符相等的位置index,以及最长公共子串的长度length,然后从index位置往回倒推index个字符即可

    1K10

    LCS 算法:Javascript 最长公共子序列

    2、公共子序列(common subsequence): 给定序列X和Y,序列Z是X的子序列,也是Y的子序列,则Z是X和Y的公共子序列。...但Z不是X和Y的最长公共子序列,而序列[B,C,B,A]和[B,D,A,B]也均为X和Y的最长公共子序列,长度为4,而X和Y不存在长度大于等于5的公共子序列。...对于序列[A,B,C]和序列[E,F,G]的公共子序列只有空序列[]。 3、最长公共子序列:给定序列X和Y,从它们的所有公共子序列中选出长度最长的那一个或几个。...那我们先看B,${X1} == ${Y0}, 我们得到一个新的公共子串了,应该加1。为什么呢?因为我们这个矩阵是一个状态表,从左到右,从上到下描述状态的迁移过程,并且这些状态是基于已有状态累加出来的。...A[i]为A的第i个元素,A(i)为由A的第一个元素到第i个元素所组成的前缀。m(i, j)为A(i)和B(j)的最长公共子序列长度。

    2.3K101

    【算法】最长公共子序列(CC++)

    最长公共子序列(LCS,Longest Common Subsequence)问题简称(LCS),是动态规划里面里面的基础算法。...它的所解决的问题是,在两个序列中找到一个序列,使得它既是第一个序列的子序列,也是第二个序列的子序列,并且该序列长度最长。由下图中两个序列,我们可以看出来最长公共子序列为[s c r g]。...: 文字去描述二分优化的过程不太好描述跟理解,那么我们进行图解一下算法的实现过程,希望对大家有所帮助。...原题链接:【模板】最长公共子序列 - 洛谷 题目描述 给出 1,2,…,n 的两个排列P1​ 和 P2​ ,求它们的最长公共子序列。 输入格式 第一行是一个数 n。...,lower_bound实现更简单 } cout<<len<<endl;//最后输出长度即可 return 0; } 最长公共子序列(LCS)是算法动态规划之中最基础的部分,是每一位算法初学者的首选

    13610

    最长公共子串 子序列

    本文记录寻找两个字符串最长公共子串和子序列的方法。...名词区别 最长公共子串(Longest Common Substring)与最长公共子序列(Longest Common Subsequence)的区别: 子串要求在原字符串中是连续的,而子序列则只需保持相对顺序...最长公共子串 是指两个字符串中最长连续相同的子串长度。 例如:str1=“1AB2345CD”,str2=”12345EF”,则str1,str2的最长公共子串为2345。...最长公共子序列 子串要求字符必须是连续的,但是子序列就不是这样。 最长公共子序列是一个十分实用的问题,它可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。...对一段文字进行修改之后,计算改动前后文字的最长公共子序列,将除此子序列外的部分提取出来,这种方法判断修改的部分,往往十分准确。

    4.5K40

    漫画:最长公共子序列

    题目: 给定两个字符串 str1 和 str2,返回这两个字符串的最长公共子序列的长度 解释:一个字符串的子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符...阿宝的想法 dp 是个二维数组,即 dp[i][j], 表示对于子串 str1[0..i] 与子串 str2[0..j], 它们的最长公共子序列长度为 dp[i][j],这样的话根据定义, dp[str1...代表除此相同字符外的 i,j 索引之前字符串的公共子序列。...[0..j-1] 的最长公共子序列 既然 dp[i][j] 有可能等于这两个值,那么显然应该取这两者的较大值, 即 dp[i][j] = max(dp[i-1][j], dp[i][j-1])。...综上可知状态状态方程如下: 阿宝的想法: 空字符串与任何字符串的最长公共子序列都为 0,所以 dp[0][i], dp[j][0] 都为 0(i 为 0 到 str1 的长度, j 为 0 到 str2

    1K31

    最长公共子序列问题

    问题描述: 求两个字符序列的公共最长子序列。 ---- 最长公共子串 在回到子序列问题之前,先来了解一下子串的问题。 例如,HISH和FISH两个字符序列的公共最长子串就是:ISH。很容易理解。...3.网格的坐标轴是什么? 在动态规划中,你要将某个指标最大化。在这个例子中,你要找出两个单词的最长公共子序列。hish和fish都包含的最长子序列是什么?hish和vista呢?这就是你要计算的值。...对于前面的背包问题,最终答案总是在最后的单元格中。单对于LCS问题来说,答案为网格中最大的数字——它可能并不位于最后的单元格中。例如单词hish和vista的最长公共子串时,网格如下: ?...---- 最长公共子序列 假设Alex不小心输入了fosh,那么它原本是想输入fish还是fort呢?我们使用最长子序列来比较它们。 ? 最长公共个子串的长度相同,都包含两个字母。...这里比较的是最长公共子串,但其实应该比较最长子序列:两个单词中都有的序列包含的字数。如何计算最长公共子序列呢? 下面是用于计算fish和fosh的最长公共子序列的网格: ?

    1.5K40

    最长公共子序列(LCS)

    最长公共子序列(LCS) 0、写在前面 1、问题描述 2、最长公共子序列的结构 3、子问题的递归结构 4、计算最优值 5、算法的改进 6、参考 ---- ---- 0、写在前面 若给定序列X={x1...1、问题描述 给定序列 X=, Y=,求 X 和 Y 的最长公共子序列 实例: X: A B C B...若xm≠yn且zk≠xm,则Z是xm-1和Y的最长公共子序列。 若xm≠yn且zk≠yn,则Z是X和yn-1的最长公共子序列。...3、子问题的递归结构 由最长公共子序列问题的最优子结构性质建立子问题最优值的递归关系。用c[i][j]记录序列和的最长公共子序列的长度。...如果只需要计算最长公共子序列的长度,则算法的空间需求可大大减少。事实上,在计算c[i][j]时,只用到数组c的第i行和第i-1行。因此,用2行的数组空间就可以计算出最长公共子序列的长度。

    93710
    领券