求最长公共子序列

【基础算法】求最长公共子序列 【基础算法】求最长公共子序列 时间限制: 1 Sec  内存限制: 64 MB 题目描述 一个给定序列的子序列是在该序列中删去若干元素(也可以不删去)后得到的序列。例如Z="BCDB" 就是X="ABCBDAB"的一个子序列,而Z="CBBD"则不是X的子序列。 给定三个序列 X,Y和Z,如果Z既是X的一个子序列又是Y的一个子串,则称Z是X和Y的公共子序列。 例如X=" 阅读详情

题目:

给两个字符串a,b,找出他们两的最长公共子序列长度,和一个最长公共子序列。

比如:a = “ABCBDAB”, b = “BDCABA”;

则最大子序列长度是4,满足的子序列有B D A B。

思路:

注意是子序列,不是子串,子序列不要求连续。
动态规划。
dp[i][j]表示字符串a从0~i位置,字符串b从0~j位置,此时的最长公共子序列。

如果i位置与j位置对应的字符相同,那么当前位置的LCS的长度等于上一个位置的LCS长度+1,即为dp[i][j]=dp[i-1][j-1]+1;

如果i位置与j位置对应的字符不相同,可能会是i-1位置与j位置字符相同,也可能是i与j-1位置字符相同。那么当前位置的LCS的长度要么等于(i-1,j)位置的,要么等于(i,j-1)位置的。dp[i][j]=max(dp[i-1][j],dp[i][j-1]);

再用一个二维数组记录路径。
seq=”“;代表我们要找的子序列
path[n][m]
如果a[i]=b[j],那么path[i][j]此处对应的状态设为0,可以加入到seq中;
如果a[i]≠b[j],那么path[i][j]为1表示从(i-1,j)到(i,j),如果path[i][j]为-1表示从(i,j-1)到(i,j)

我们根据记录的路径状态递归回溯将相同的字符加入到seq中。

代码:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

int findLongestCommonSubsequenceLength(string &a,string& b,vector<vector<int>> &path){
    int la = a.size();
    int lb = b.size();
    vector<vector<int>> dp(la+1,vector<int>(lb+1,0));
    for (int i = 1; i <= la; i++){
        for (int j = 1; j <= lb; j++){
            if (a[i-1] == b[j-1]){
                dp[i][j] = dp[i-1][j-1] + 1;
                path[i][j] = 0;
            }
            else{
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
                path[i][j] = dp[i - 1][j] > dp[i][j - 1] ? 1 : -1;
            }
        }
    }
    return dp[la][lb];
}
void LongestCommonSubsesequence(int i,int j,string &seq,vector<vector<int>> &path,string &a){
    if (i < 1 || j < 1){
        return;
    }
    if (path[i][j] == 0){
        LongestCommonSubsesequence(i-1,j-1,seq,path,a);
        seq += a[i-1];
    }
    else if (path[i][j] == 1){
        LongestCommonSubsesequence(i-1,j,seq,path,a);
    }
    else if (path[i][j] == -1){
        LongestCommonSubsesequence(i,j-1,seq,path,a);
    }
}
int main()
{
    string a = "ABCBDAB";
    string b = "BDCABA";
    int la = a.size();
    int lb = b.size();
    vector<vector<int>> path(la + 1, vector<int>(lb + 1));
    printf("%d\n", findLongestCommonSubsequenceLength(a, b,path));
    string seq;
    LongestCommonSubsesequence(la,lb,seq,path,a);
    cout << seq;
    system("pause");
    return 0;
}

补充:
其实求最长回文子序列也可以用最长公共子序列啊,把字符串逆序后,与原字符串找它们之间的最长公共子序列长度,即为,原字符串的最长回文子序列

最长公共子序列 【微软面试100题 第五十六题】 题目要求:   如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串中,则字符串一称为字符串二的子串。   注意,并不是要求子串(字符串一)的字符必须连续出现在字符串二中。   请编写一个函数,输入两个字符串,求它们的最长公共子序列,并打印出最长公共序列。   例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA、BDAB和BCAB都是它们的最长公共子序列,则输出 阅读详情

相关推荐

求解两个字符串的最长公共子序列

创建一个二维数组。

usstmiracle的博客 1万+

最长公共子序列长度的四种解法

本文使用四种不重复的方法求解最长公共子序列的长度。

qq_43213240的博客 5136

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

最长公共子序列和最长公共子串区别        最长公共子串(Longest Common Substring)与最长公共子序列(Longest Common Subsequence)的区别: 子串要求在原字符串中是连续的,而子序列则只需保持相对顺序一致,并不要求连续。例如X = {a, Q, 1, 1}; Y = {a, 1, 1, d, f}那么,{a, 1, 1}是X和Y的最长公共子序

Sunshine的专栏 3万+

详细描述求最长公共子序列算法

子序列与字串的区别: 子序列不要求公共部分在原字符串中连续,而字串要求连续。 动态规划求解: 例子:"bdcaba", "abcbdab"  最长的公共子序列为 b c b a 和 b d a b 1:首先分析状态转移数组dp[i][j]的含义: 指的是 字符串 s1 从 0到n-1 和 字符串 s2 从 0到m-1 的最大公共子序列的长度。 如上面 dp[0][0

爱老婆爱生活~ 1307

求最长公共子序列的LCS算法

实现了求最长公共子序列的算法,内容简单易懂,代码也很短

鼎阳示波器SCPI指令与MD5算法解锁带宽升级实战

本文详细介绍了鼎阳示波器通过SCPI指令与MD5算法实现带宽升级的实战流程。从设备连接、信息获取到Python密钥生成脚本解析,逐步指导用户完成升级操作,并涵盖常见问题排查与功能选件激活指南,帮助用户充分释放设备潜能。

www00的博客 342

最长公共子序列求方案数

可以发现,在这种划分方式中,我们仅仅做到了不漏,而没有做到不重,因为。位构成最长公共子序列的方案数,然后在状态转移的时候维护好。进行转移,因此我们这里其实多转移了一次。,因此在求方案数时,就有了一个大坑。和背包问题求方案数一样,我们令。不过如上所说,有一个大坑,当。滚动数组优化版本,优化掉一维。转移而来,我们通常将。

jyyyyx的算法之旅 937

【生产实践】SSH服务弱加密算法修复指南(附完整操作流程)

SSH服务弱加密算法漏洞修复方案 检测发现SSH服务存在支持弱加密算法漏洞,主要风险包括: 使用arcfour、aes128-cbc等易被破解的算法 面临密钥恢复、重放攻击等安全威胁 提供两种修复方案: 推荐方案:升级OpenSSH至最新版本 替代方案:修改SSH配置禁用弱算法(需注意可能影响旧客户端连接) 修复步骤: 编辑/etc/ssh/sshd_config 注释或删除弱算法配置 添加强加密算法(如aes128-ctr等) 重启SSH服务 注意事项: 建议先在测试环境验证 可能需配合客户端升级 操作前

SunMy的博客 3092

求最长公共子序列长度

求两个字符串的公共子序列1.求最长公共子序列(子序列可以不连续)2.最长连续子串 1.求最长公共子序列(子序列可以不连续) 这是一道动态规划题,设二维数组dp[i][j],dp[i][j]表示a串前i个字符(包括第i个)与b串前j个字符(包括第j个)所有的公共子序列的最长长度。 例如,a串abbcd,b串abcd,dp[3][3]就表示的a的前三个字符与b的前三个字符的最长公共子序列长度,值为2。...

QingtianD的博客 4145

gradle报错:A problem occurred configuring root project ‘My Application‘.

即使翻译了,我开始也看不懂,到处找网上教程,但都是改环境变量。马虎的我即使看了很多遍,改了很多遍也没反应过来,今天第一次搞gradle,突然就报错了,打印出。好了我就继续看项目了。

m0_59878789的博客 4090

Python 爬虫实战:共享单车数据采集全流程与市场洞察深度剖析

本文介绍了如何利用Python爬虫技术获取和分析共享单车运营数据。文章从项目背景出发,详细阐述了系统架构设计,包括数据抓取、清洗存储、分析和可视化模块。通过Scrapy、BeautifulSoup等工具实现数据采集,使用Pandas进行数据清洗,并借助Matplotlib进行可视化分析。实战部分展示了爬虫代码示例和城市分布、使用频率等分析案例。最终指出数据驱动分析有助于了解行业现状和市场趋势,未来可结合机器学习等方法进行深入洞察。该技术方案为共享单车行业研究提供了有效的数据支持。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2232

java 求最长公共子序列_Java求最长公共子序列的长度

public class LCS {private enum Path {TOP, LEFT, TOP_LEFT};private static int[][] commonLenth;private static Path[][] path;private static String stringA = "ABCBDAB";private static String stringB = "BDC...

weixin_32860759的博客 453

33、嵌入式系统中的内存操作与实时操作系统

本博客详细探讨了嵌入式系统中的内存操作和实时操作系统(RTOS)的基本原理及应用。内容涵盖C、C++和MicroPython三种语言下的SDRAM读写示例,并结合机器人真空吸尘器的实际应用说明内存的使用场景。此外,还介绍了RTOS的核心概念、组件及其工作机制,包括任务、事件、互斥锁、信号量、队列等,并以FreeRTOS和Mbed OS为例展示了RTOS的配置与使用方法。最后,通过常见问题和实践项目加深对嵌入式系统开发的理解。

zz67890的博客 144

求最长公共子序列(LCS)

题目: 求最长公共子序列(LCS)   思路: 经典的动态规划法, c[i,j]表示Xi与Yj的最长公共子序列, 其中 Xi = {x1,、、、xi} Yj = {y1,、、、yj} 注意:这里的子序列在原序列中可以是不连续的。

huangxy10的专栏 983

AI Agent Harness Engineering 的“热插拔”能力:模块化设计思路

本文我会结合我在大厂做AI Agent平台的实战经验,从核心概念、架构设计、代码实现、落地实战多个维度,给大家详细讲解AI Agent Harness Engineering的核心能力——热插拔的模块化设计思路。我们会从问题根源出发,一步步搭建一个完整的支持热插拔的Agent Harness框架,包含组件抽象、注册中心、生命周期管理、配置驱动、容错机制等核心模块。

AI天才研究院 501

8-bit量化在YOLOv11中的部署实践-(使用PTQ、QAT量化技术实现模型体积压缩和推理加速)

本文系统介绍了YOLOv11模型量化技术,主要包括三个核心部分:首先阐述模型量化的基础理论,包括量化分类、数学原理和性能影响;其次分析YOLOv11架构特点及其量化敏感层;最后详细讲解训练后量化(PTQ)的具体实现流程。研究表明,8-bit量化可使YOLOv11模型大小缩减至1/4,推理速度提升1.7-2.3倍,精度损失控制在1%以内。文章特别强调了校准算法选择(如最小最大值法和KL散度法)对量化效果的关键影响,并提供了完整的代码实现示例,为YOLOv11的高效部署提供实用指导。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1625

动态规划:求两个字符串的最长公共子序列

问题描述:求两个字符串的最长公共子序列。 思路:使用动态规划的思想,将问题分解为小的子问题。 假设两个字符串序列分别为:X{x0, x1, x2,......, xm}, Y{y0, y1, y2,......, yn}。从后往前比较字符。 如果xm == yn, 则这个字符就是子序列中的一个字符, LCS就是序列{x0, x1, x2,......, xm-1}和{y0, y1, y2,......, yn-1}的LCS加上xm(或yn)。 如果xm != yn, 则求序列{x0, x1, x2,...

张壮壮的博客 8418

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

LCS 求最长公共子序列 dp

【1】求最长公共子序列 要求可以不连续 不输出,只求长度;#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<string> #include<cmath> #include<vector> using namespace std; #define N 100000 int s[

wuxiaowu547的博客 268

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

求两个字符串的最长公共子序列——程序设计艺术与方法实验四 动态规划算法的实现

求两个字符串的最长公共子序列——程序设计艺术与方法实验四 动态规划算法的实现 (1) 求两个字符串的最长公共子序列。 - 151 - X 的一个子序列是相应于 X 下标序列{1, 2, …, m}的一个子序列,求解两个序列的所有子序列中长度最大的,例如输入:pear, peach 输出:pea。 步骤: 确定子问题 确定状态转移方程 res[i][j]表示text1截止到第i个字符串,text2截止到第j个字符串的最长公共子串 text1[i]=text2[j],res[i][j]=原结果 + 1 te

小哨的博客 1600

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【洛谷】P1439 【模板】求最长公共子序列

【洛谷】P1439 【模板题】求最长公共子序列 1.题意 给出两个序列,如何求出其最长公共子序列? 2.分析 step1.映射序列 step2.用O(NlogN)求最长不下降子序列

说文科技,做有态度的研究。 949

用O(nlogn)求特定的最长公共子序列

时间限制:1 sec 空间限制:256 MB 问题描述 给定两个 1 到 n 的排列 A,B (即长度为 n 的序列,其中 [1,n] 之间的所有数都出现了恰好一次)。 求它们的最长公共子序列长度。 输入格式 第一行一个整数 n ,意义见题目描述。 第二行 n 个用空格隔开的正整数 A[1],⋯,A[n],描述排列 A。 第三行 n 个用空格隔开的正整数 B[1],⋯,B[n],描述排...

阿不灌的拉的博客 1035
上一篇: 16年腾讯春招--求最长回文子序列长度
下一篇: 电面:给一个数组找出和为k的两个数
_IanXiao
博客等级 码龄12年 84粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值