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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

参考

http://open.163.com/newview/movie/free?pid=M6UTT5U0I&mid=M6V2U1HL4

问题是给定字符串x和y,求出两个当中最长的公共子序列。比如x=abcdef y=acefg,那么他们的最长公共子序列就是acef。就是求x的所有可能的子字符串与y所有的子字符串匹配,如果相同,那么就是一个公共子序列,然后求最长的一个。

建议观看上面的公开课,讲的非常好。本文思路是根据上面的公开课总结实践的。

我们先看看求一个字符串的所有子序列,有什么规律。比如给定一个字符串abc,那么有多少子序列呢?a b c ab ac bc abc还有一个空,就是2^3。按照上面公开课讲的非常通俗易懂,就是字符串一共有n个字符,那么每一位的字符都有两个状态----0-不是子序列的一员 1-是子序列的一员。那么总共的种类就是2^n种。这是最坏的情况,字符串中没有相同的字符,如果有,结果会比这个少。但是计算就是这么计算的。

了解了上面,那么我们进一步判断,如果给定一个x的子序列x1,那么怎么判断y中是否含有呢?简单的方法就是从x1的起始位置和y的起始位置开始判断,如果相同,每个索引加一,直到x1/y的字符串判断结束。如果不匹配,那么y索引加一,再从x1的开头开始计算。

这种是穷举法,肯定能得到结果,但是时间和空间都是最差的。我们先实现看看(穷举法排列组合可以参考排列组合

struct MNODE
{
    string substr;
    MNODE* pnext;
    MNODE()
    {
        pnext = nullptr;
    }
};
MNODE* msubstr(string& srcstr, int index, int sublen)
{
    MNODE* tmpp = nullptr;
    MNODE* prep = nullptr;
    if (index >= sublen && sublen > 0)
    {
        if (sublen == 1)
        {
            for (int i = 0; i < index; i++)
            {
                MNODE* ftpn = nullptr;
                if (tmpp == nullptr)
                {
                    tmpp = new MNODE;
                    prep = tmpp;
                    ftpn = tmpp;
                }
                else
                {
                    ftpn = new MNODE;
                    prep->pnext = ftpn;
                    prep = ftpn;
                }
                ftpn->substr = srcstr[i];
            }
        }
        else if
实验七 动态规划 任务:编写用动态规划解决数塔问题。 阅读详情

相关推荐

动态规划常用解题思路】2 —— 最长公共子序列

题目描述给出1-n的两个排列P1和P2,求它们的最长公共子序列。输入第一行是一个数n;(n是5~1000之间的整数)接下来两行,每行为n个数,为自然数1-n的一个排列(1-n的排列每行的数据都是1-n之间的数,但顺序可能不同,比如1-5的排列可以是:1 2 3 4 5,也可以是2 5 4 3 1)。输出一个整数,即最长公共子序列的长度。样例。

nihaoxingshijie的博客 998

算法系列之六:最长公共子序列(LCS)问题(连续子序列)的三种解法.doc

算法系列之六:最长公共子序列(LCS)问题(连续子序列)的三种解法.doc

动态规划---例题2.最长公共子序列问题

本题与力扣主站1143题相同. 一.问题描述 一个给定序列的子序列是在该序列中删去若干元素后得到的序列。 确切地说,若给定序列X=<x1, x2,…, xm>,则另一序列Z=<z1, z2,…, zk>是X的子序列是指存在一个严格递增的下标序列 <i1, i2,…, ik>,使得对于所有j=1,2,…,k有 例如,序列Z=<B,C,D,B>是序列X=<A,B,C,B,D,A,B>的子序列,相应的递增下标序列为<2, 3, 5, 7>。

PG13okc的博客 1万+

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

若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk} 是X的子序列 是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。 例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。 给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X...

辣条不爱辣的博客 1600

动态规划案例-最长公共子序列(含表格填写过程、问题理解、实例解决、例题答案)

动态规划案例-最长公共子序列 内含问题理解、表格填写、实例解决以及例题 帮助全方面解决问题 在线博主,及时解答

vangoudan的博客 7863

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

一道经典的动态规划题目。

每周更新,热爱coding! 2391

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

今天,我给大家带来的是“最长公共子序列”(LCS)的讲解。限于水平,这里仅介绍O(nm)算法。 最长公共子序列其实是很好理解的。 顾名思义,给出多个(这里暂且只考虑两个)序列,求他们的最长公共子序列,就是在这两个序列中分别删去一些的字符,得到两个相同的序列,使得这两个相同的序列最长。 当然上面是我自己用比较好理解的方法写的,于某些“百科”上的解释就是“一个序列S,如果分别是两个或多个已知序...

frankchenfu的博客 1122

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

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

举目沧桑的博客 1405

part2 基于动态规划最长公共子序列算法

基于动态规划最长公共子序列算法

a1b2c3666666的博客 856

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

1. 问题描述 2. 问题分析 1. 满足最优性原理 2. 求解步骤 3. 实例 3. 求解最长公共子序列(回溯法) 1. 求解思路 2. 算法设计 3. 算法分析

qq_45069496的博客 674

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

动态规划2--最长公共子序列 最长公共子序列1:http://www.cnblogs.com/Renyi-Fan/p/6955352.html 一、心得 所有的回溯找路径:记录之前来的路径 二、题目 找两个字符串的最长公共子序列 char s1[MAXLEN]={"ABCBDAB"}; char s2[MAXLEN]={"BDCABA"}; 答案为4 三、分析 递推...

weixin_34216036的博客 92

【算法设计与分析】(2最长公共子序列问题(动态规划

求两个字符串的最长公共子序列的长度。 输入: 第一行字符串 S1 第二行字符串 S2 (注:字符为英文字母,大小写均可。字符串长度大于等于1 ,各不大于10000) 输出: 数字 M ,为最长公共子序列长度。 例如: 输入: BDCABA ABCBDAB 输出: 4 思路:这是一道经典的动态规划问题 先初始化状态数组a的边界值,再逐位判断x[i]与y[j],如果相等,则等于...

小竤的博客 2123

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

0.前置定义 0.1 子序列 一个给定序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果. 例: X = <A, B, C, B, D, B> Z = (B, C, D, B) 是X的子序列 W = (B, D, A) 不是X的子序列 0.2 公共子序列 给定两个序列X和Y, 如果Z既是X的子序列,又是Y的子序列,称它是X和Y的公共子序列. 0.3 前缀,第i前缀 给定一个...

qaQAQ 690

蓝桥备赛——动态规划2最长公共子序列LCS)

那么s和t的最长公共子序列为"BDAB","BCBA","BCAB" ,最大长度为4;若是si+1== ti+1,那么dp[i+1][j+1] = dp[i][j]+1;= ti+1,那么就取当前前一行相同列的和前一列相同行的最大值。创建个二维的dp 用来存储,s1到si,t1到ti内的公共序列的个数(长度)。LCS:最长公共子序列(不要求是连续的)注意第一行,第一列都是从零开始的。

qq_46300524的博客 228

动态规划学习与实例(2) 最长公共子序列

最长公共子序列LCS( longest common subsequence )问题描述 一个给定序列的子序列是该给定序列中去掉0个或者多个元素,此处的子序列不要求必须连续. 给定序列 XX 和 YY , 如果 ZZ 既是 XX 的一个子序列,又是 YY 的一个子序列, 则 ZZ 是 XX 和 YY 的公共子序列. 找出给定序列 XX 和 YY 的最长公共子序列 LCSLCS. 问题分析 穷举方法:

jack_thu的专栏 581
上一篇: k8s 开船记-故障公告:自建 k8s 集群在阿里云上大翻船
下一篇: 我终于懂得如何使用matplotlib进行画图
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值