最长公共子序列 LCS

LCS算法&最大公共子串&最长公共子序列 PHP 实现 求两个字符串的最大公共子串&最长公共子序列输入: abcbdab bdcaba4 即 bdcaba 与 abcbdab 的最大公共子串长度为 4 常规思路枚举法,算出两个字符串的所有子序列,然后分别作比较,选出最大的一个子串 缺点:对于一个长度为 n 的字符串,子串个数有 2 的 n 次方个,然后在依次比较两个字符串的子串,效率过低 动态规划 LCS算法以动态规划的思想来解这个题,我们用一 阅读详情
题目: http://acm.nyist.net/JudgeOnline/problem.php?pid=36

介绍一下定义先~

子序列:一个序列的子序列,就是该序列删掉若干个(0~len-1)元素后的序列

公共子序列:一个序列c如果既是序列a删去若干元素后的结果,又是序列b删去若干元素后的结果,则:c是a、b两个序列的公共子序列

最长公共子序列:c是a和b的公共子序列中最长的一个序列(可能有多个!)

LCS问题具有最优子结构特性:

  第一个版本是最原始的LCS,空间复杂度为O(len1*len2),可以在O(len1+len2)时间复杂度内构造出LCS的解 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>

using namespace std;

char s1[1005], s2[1005];
int dp[1005][1005];

void print_LCS(int i, int j)
{
    if(i==0 || j==0)    return;
    
    if(s1[i-1]==s2[j-1]) {
        print_LCS(i-1, j-1);
        printf("%c", s1[i-1]);
    } else if(dp[i][j-1] > dp[i-1][j])    print_LCS(i, j-1);
    else    print_LCS(i-1, j);
}

int main ()
{
    int n;
    scanf("%d", &n);
    while(n--) {
        scanf("%s%s", s1, s2);
        int len1 = strlen(s1);
        int len2 = strlen(s2);
        
        // 最原始的 LCS,空间复杂度O(n^2) 
        for(int i=1; i<=len1; i++) {
            for(int j=1; j<=len2; j++) {
                if(s1[i-1]==s2[j-1])    dp[i][j] = dp[i-1][j-1]+1;
                else    dp[i][j] = max(dp[i][j-1], dp[i-1][j]);
            }
        }
        printf("%d\n", dp[len1][len2]);
        
        // 打印 LCS 
//        print_LCS(len1, len2);
//        printf("\n");
    }
        
    return 0;
}

 

  第二个版本是优化后的LCS,空间复杂度可以达到O(min(len1,len2)),但是由于信息不足,无法构造出LCS的解

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>

using namespace std;

char s1[1005], s2[1005];
int dp[1005];

int main ()
{
    int n;
    scanf("%d", &n);
    while(n--) {
        scanf("%s%s", s1, s2);
        int len1 = strlen(s1);
        int len2 = strlen(s2);
        
        // 空间复杂度可以降为O(min(len1,len2))
        int cur, prev;
        for(int i=1; i<=len1; i++) {
            prev = 0;
            for(int j=1; j<=len2; j++) {
                cur = dp[j];
                if(s1[i-1]==s2[j-1]) {
                    dp[j] = prev+1;
                }
                else    dp[j] = max(dp[j-1], dp[j]);
                prev = cur;
            }
        }
        printf("%d\n", dp[len2]);
        memset(dp, 0, sizeof(dp)); // 不像之前的版本,这里要清零 
    }
        
    return 0;
}

 

【Python】最长公共子序列LCS LCS的定义 最长公共子序列,即Longest Common Subsequence,LCS。 一个序列S任意删除若干个字符得到新序列T,则T叫做S的子序列; 两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y的最长公共子序列。 字符串13455 与245576的最长公共子序列为455 字符串acdfg与adfc的最长公共子序列为adf 注意区别最长公共子串(Longest C... 阅读详情

相关推荐

最长公共子序列(LCS问题)

先简单介绍下什么是最长公共子序列问题,其实问题很直白,假设两个序列X,Y,X的值是ACBDDCB,Y的值是BBDC,那么XY的最长公共子序列就是BDC。这里解决的问题就是需要一种算法可以快速的计算出这个最大的子序列,当然,用最简单的方法就是列出XY全部的子系列然后一个个对比,但这样的时间复杂度是绝对不能接受的。假设X的长度是m,Y的长度是n,拿X的一个子序列和Y进行对比的时间是n,计算X的全部子序

小梦馆 4592

PHP 求两个字符串的最长公共子串

$a = 'abceee12345309878'; $b = 'abceeew2345i09878fsfsfsfabceeewsfsdfsfsabceeew'; $c = []; $lenht1 = strlen($a); $lenth2 = strlen($b); for ($i=0;$i     for ($j=0;$j         $n = ($i-1>=0 &&

2663

最长公共子序列——LCS(c/c++ 伪代码)

给定两个序列 X,Y,求X和Y的长度最长的公共子序列 背包二维,一维优化

THOOOR的博客 3634

【动态规划】Dynamic Programming

动态规划 一、动态规划 动态规划(Dynamic Programming)是一种设计的技巧,是解决多阶段决策过程最优化问题的通用方法。 基本思想:将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解(这部分与分治法相似)。与分治法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到...

dbbaq24022的专栏 456

最长公共子序列(LCS)问题

LCS问题描述 定义:最长公共子序列(Longest Common Subsequence),即定义两个序列X和Y,求X和Y的最长公共子序列(子序列:一个序列S任意删除若干个字符得到新序列T,则T叫做S的子序列) 例如:字符串13455与245576的最长公共子序列为455 LCS的意义:LCS可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。 LCS解法的探索...

bohenmian的博客 656

Algorithm LCS最长公共子序列

算法: 递归法:对于序列A[0,n]]和B[0,m],LCS(A,B)无非三种情况 若A或B为空,则取作空序列,作为递归基 如果末字符相等,即A[n]=B[m]=‘X’,则取LCS(A[0,n),B[0,m))+‘X’,如果前者可以求解,则问题的规模被缩小 如果末字符不相等,即A[n]!=B[m],比如A[n]=a,B[m]=b,则a和b至多有一个会出现在最后的解里(对解有贡献)。因为...

A land whole of flowers. 304

最长公共子序列(LCS)

题目地址http://zju.acmclub.com/index.php?app=problem_title&id=1&problem_id=1132 采用动态规划策略,先初始化二维数组的第0行和第0列,然后从第一行或第一列数组开始,依次填满数组,并记录箭头方向。 ps:此题要求输出最长子序列的长度,即输出最终数组的右下角元素即可,若要求输出子序列则需要按照箭头走,只输出指向左上角的箭头。

messiandzcy的专栏 737

LCS-PHP:PHP 中各种 LCS(最长公共子序列)的实现。 有关更多详细信息,请参阅 Readme.md

LCS-PHP PHP 中各种 LCS(最长公共子序列)算法的实现。 有关更多详细信息,请参阅 Readme.md。 已实施以下算法: 朴素递归算法(如定理 15.1 第 392 页所暗示) 带记忆的递归算法 算法的动态规划版本 二次时间线性空间算法 (Hirschberg) 有关更多详细信息,请参阅 。 访问了解 Profiler 运行和图像

PHP 求解两字符串所有公共子序列及最长公共子序列 支持多字节字符串

【代码】PHP 求解两字符串所有公共子序列及最长公共子序列。

m0_37711659的博客 947

深入了解 CPU 的型号、代际架构与微架构!

深入了解 CPU 的型号、代际架构与微架构!

欢迎朋友,我是一名十多年开发经验的新手,希望多多指教。 3195

grafana对接zabbix数据展示

【配置】点击【模板】点击【创建模板】添加三个监控项:【名称】搜索【】创建的模板;点击上方【监控项】,点击创建【监控项】点击上方【触发器】点击【创建触发器】主机关联监控模板:左侧【配置】点击 【主机】点击【Zabbix server】查看:左侧点击【监测】点击【主机】点击【Zabbix server】点击最新数据,找到添加的三个模板主机关联监控模板:左侧【配置】点击 【主机】点击【Zabbix server】把监控模板用起来① 明确获取指标数据的方法。

2401_83883919的博客 6592

最长公共子序列(LCS)

区分子序列和子串子序列:给,也可以说从给定序列中选取几个元素的结果(有顺序)。子串:给定串中组成的子序列为该串的子串。举例: (最长公共子序列不唯一,但序列长度是相同的)

Zhang_Qin123的博客 3292

通信系统原理[郭宇春]——模拟调制系统——课后习题答案

通信系统原理[郭宇春]——第三章课后习题答案,出错望指正!

尧呱呱的博客 3844

动态规划-求最长公共子序列LCS长度-输出所有的最长公共子序列LCS-Java实现

题目:给定两个序列X={x1,x2,…xm},Y={y1,y2,…yn},找出X和Y的最长公共子序列。 分析: 1 最长公共子序列概念 实现明确一个点就是,子序列是一个序列中去掉若干元素后得到的序列,也就是说子序列的元素下标是递增的就行,不需要在原序列中连续。 最长公共子序列,显而易见就是序列X和Y都有的最长的子序列。 2 BruteForce 暴力求解法 对于序列X的所有长度不超过Y的子序列,都...

天天开心 2729

如何用 OBProxy 实现 OceanBase 的最佳路由策略

本文基于业务中一类常见的路由问题展开,对OceanBase的路由功能及对应配置项做详细介绍,指导用户在业务实践中如何正确的配置路由策略及快速排查路由问题

OceanBase分布式数据库的博客 1679

vuecli3 实现 移动端和pc端 界面切换(两套代码)

适合场景 多页面多系统应用 所有系统都在同一目录下。配置多入口多出口。每个系统之间可以链接。每个系统内依然采用Vue单页应用开发。 产品需求:一套代码 兼容pc端和移动端 , 移动端和pc端的样式布局差别很大,需要使用多界面,并判断使用手机的时候跳转移动端代码,使用pc端跳转pc端代码。 项目目录 分为两部分代码,pc 和mobile 第一步:创建一个登陆页面的文件 在项目public文件夹下创建一个login.html,其实就是将index.html复制一份,将title改一下: <!DOCTYP

你怎么也喜欢嘴巴嘟嘟 5919

『经典DP入门』LCS 最长公共子序列问题

最长公共子序列问题(Longest Common Subsequence problem):给定两个序列X = <x1,x2,...,xm>和Y = <y1,y2,...,yn>,求X和Y长度最长的公共子序列。 注:本文的大多数概念及求解方法来自《算法导论》 使用动态规划求解LCS问题过程: 一、刻画最长公共子序列的特征 LCS的最优子结构定理:设X={x1,x2,...

Miserable_ccf的博客 7309

华为硬件逻辑岗笔试题(一)

积少成多,集腋成裘,坚持!!! 目录 1. 进制转换 2. 状态机和编码方式 3. 存储器的分类 4. Verilog语法中的操作符 5. 对组合逻辑的认识 6. 对时序逻辑的认识 7. 竞争冒险的认识 8. 基本时序逻辑电路 9. 建立时间和保持时间 10. 同步时序电路 11. 组合逻辑和时序逻辑判断 13. 基本总线的理解 14.加法器 15.FPGA开发工具 1. 进制转换 1、十进制46.25对应的二进制表达式为( )。 A 101110.11...

qq_42235129的博客 1万+

最长公共子序列问题(LCS)

问题描述:给定两个序列X=< x1,x2,x3,…,xm >和Y=< y1,y2,y3,…,yn >,求X和Y长度最长的公共子序列

努力努力再努力x 716

【四足机器人项目实战】四足机器人嵌入式硬件设计

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、电源管理板设计及制作二、通讯中继板设计及制作三、力控无刷电机驱动板设计及制作1.磁场定向控制FOC控制原理2.电机转子位置、速度检测原理3.硬件CAN通讯原理 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对四足机器人–嵌入式硬件设计做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 一、电

qq_35635374的博客 1万+

AgentScope实战训练营- Java从零开始快速构建Agent完整教程

本文基于阿里巴巴开源的 AgentScope Java 框架,从零开始手把手带你构建 AI 智能体应用。内容涵盖环境搭建、基础对话、工具调用、结构化输出、多Agent流水线、Hook可观测性、会话持久化、MCP协议、RAG知识库集成、多模态工具、技能系统、Spring Boot Web部署等21个核心模块,附带完整可运行代码示例,帮助Java开发者快速掌握Agent开发全流程。

program哲学 858
上一篇: POJ 3280 —— Cheapest Palindrome
下一篇: POJ 1141 —— Brackets Sequence
AcIsFun
博客等级 码龄10年 1粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值