LeetCode hot 100—最长公共子序列

动态规划 最长公共子序列 过程图解 1.基本概念       首先需要科普一下,最长公共子序列(longest common sequence)和最长公共子串(longest common substring)不是一回事儿。什么是子序列呢?即一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果。什么是子串呢?给定串中任意个连续的字符组成的子序列称为该串的子串。给一个图再解释一下:        如 阅读详情

题目

给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

  • 例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。

两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

示例

示例 1:

输入:text1 = "abcde", text2 = "ace" 
输出:3  
解释:最长公共子序列是 "ace" ,它的长度为 3 。

示例 2:

输入:text1 = "abc", text2 = "abc"
输出:3
解释:最长公共子序列是 "abc" ,它的长度为 3 。

示例 3:

输入:text1 = "abc", text2 = "def"
输出:0
解释:两个字符串没有公共子序列,返回 0 。

分析

为了找出两个字符串 text1 和 text2 的最长公共子序列的长度,可以使用动态规划的方法。动态规划通过构建一个二维数组来记录两个字符串不同位置的公共子序列长度。

动态规划

代码解释

动态规划数组 dp:

  • dp[i][j] 表示 text1 的前 i 个字符和 text2 的前 j 个字符的最长公共子序列的长度。
  • 初始化 dp 数组为 0。

填充 dp 数组:

  • 遍历 text1 和 text2 的每个字符。
  • 如果 text1[i - 1] 等于 text2[j - 1],则 dp[i][j] 等于 dp[i - 1][j - 1] + 1。
  • 如果 text1[i - 1] 不等于 text2[j - 1],则 dp[i][j] 等于 std::max(dp[i - 1][j], dp[i][j - 1])。

返回结果:

  • 最终结果存储在 dp[m][n] 中,其中 m 和 n 分别是 text1 和 text2 的长度。

时间复杂度:O(m\times n),m 和 n 分别是字符串 text1 和 text2 的长度

空间复杂度:O(m\times n)

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        int m = text1.length();
        int n = text2.length();
        // 创建一个二维数组 dp 用于记录公共子序列的长度
        std::vector<std::vector<int>> dp(m + 1, std::vector<int>(n + 1, 0));
        // 填充 dp 数组
        for (int i = 1; i <= m; ++i) {
            for (int j = 1; j <= n; ++j) {
                if (text1[i - 1] == text2[j - 1]) {
                    // 如果当前字符相等,则公共子序列长度加 1
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    // 如果当前字符不相等,则取两种情况的最大值
                    dp[i][j] = std::max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
        // 返回最长公共子序列的长度
        return dp[m][n];
    }
};    
动态规划之子序列:1143. 最长公共子序列 题目描述 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。 两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。 示例 1 输入:text1 = "abcde", text2 = " 阅读详情

相关推荐

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

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

CXR_XC的博客 1万+

最长公共子序列

动态规划:最长公共子序列,代码及其填写dp表格详解

北渡的博客 1万+

力扣hot100第94题:最长公共子序列

给定两个字符串 text1 和 text2,返回这两个字符串的的长度。如果不存在 公共子序列 ,返回 0。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。示例 1:输入:text1 = "abcde", text2 = "ace"输出:3。

weixin_74009895的博客 53

最长公共子序列LCS(动态规划)—详解

一.基本概念 1、 子序列(subsequence): 一个特定序列的子序列就是将给定序列中零个或多个元素去掉后得到的结果(不改变元素间相对次序)。例如序列<A,B,C,B,D,A,B><A,B,C,B,D,A,B>的子序列有:<A,B><A,B>、<B,C,A><B,C,A>、<A,B,C,D,A><A,B...

weixin_44023658的博客 1万+

基于大模型的围术期谵妄防控系统研究报告

围术期谵妄是一种急性脑功能障碍综合征,通常发生在手术前后一段时间内。患者会出现意识障碍、注意力不集中、认知功能紊乱、睡眠 - 觉醒周期失调等症状,严重者甚至会出现幻觉、妄想和攻击行为 。这种病症不仅会给患者自身带来极大的痛苦,还会对其术后康复产生严重的负面影响。从患者角度来看,围术期谵妄会显著延长患者的住院时间,增加患者的医疗费用负担。有研究表明,发生谵妄的患者住院时间平均比未发生者延长 2 - 3 天。长时间的住院不仅会影响患者的生活质量,还可能导致患者错过最佳的康复时机,影响身体机能的恢复。同时,谵妄还

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1071

WPF基础系列六:MVVM框架

MVVM框架 文章目录MVVM框架前言一、MVVM框架简介1. 什么是MVVM?2. MVVM的优势3.MVVM的应用场景二、MVVM使用及示例 前言 在WPF开发中,经典的编程模式是MVVM,是为WPF量身定做的模式,该模式充分利用了WPF的数据绑定机制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI显示和逻辑代码的耦合度,如需要更换界面时,逻辑代码修改很少,甚至不用修改。 与WinForm开发相比,我们一般在后置代码中会使用控件的名字来操作控件的属性来更新UI,而在WPF中通常是通过

iceberg7012的博客 2万+

力扣hot100:最长公共子序列

为了求解最长公共子序列问题,我们可以使用递归来逐步探查每对字符是否匹配,并根据匹配与否决定如何继续计算子问题。:当任意一个字符串已经被遍历完(即其中一个指针越界),公共子序列的长度为 0。来记录已经计算过的结果,避免重复计算。,说明当前字符匹配,可以将这个字符纳入公共子序列,此时问题变为。,说明这两个字符匹配,公共子序列长度加 1,继续求解。数组用于存储子问题的结果,避免重复计算。开始的最长公共子序列的长度。分别表示两个字符串的长度,,选择其中较大的结果,即。的子问题,结果加 1。,选择两者的最大值。

一本大学生java学习技术分享与交流 64

深入解析DDR5 SDRAM中的CA训练模式(CATM):原理与实现

本文深入解析DDR5 SDRAM中的CA训练模式(CATM),详细探讨其工作原理与实现方法。通过分析JESD79-5标准,揭示CATM在时序校准、信号质量优化和系统稳定性方面的核心价值,并提供硬件设计考量和系统级调试技巧,帮助工程师解决高速内存系统中的信号完整性问题。

weixin_29235923的博客 383

【leetcode hot 100 1143】最长公共子序列

/ dp[i][j]表示text1的前i个元素和text2的前i个元素的最长公共子序列的长度,dp[m+1][n+1]// 要用s取0个元素,即i=0,所以i不代表第i个位置,代表前i个元素// 初始状态:dp[0][j]和dp[i][0]均为0,因为其中一个串为0,无法和其他串得到公共子串// 变化方程:当text1[i]==text[j]时,dp[i][j]=dp[i-1][j-1]+1;否则dp[i][j]=Math.max(dp[i][j-1],dp[i-1][j])

longii11的博客 346

Oracle EBS报表开发入门:Report Builder安装避坑指南(Win10/11兼容版)

本文详细介绍了在Windows 10/11系统上成功安装和配置Oracle Report Builder的完整避坑指南。通过修改系统兼容性、解决虚拟内存报错、正确设置NLS_LANG和TNS连接等关键步骤,确保开发环境稳定运行。同时,阐述了Report Builder与BI Publisher在现代Oracle EBS报表开发中的协作定位与工作流,帮助开发者高效搭建报表开发环境。

d6e7f8的博客 754

gtsam官方文档: The new IMU Factor学习笔记

gtsam官方文档:The new IMU Factor 本文为gtsam imu预积分文档学习笔记,为gtsam基于切向量实现的imu预积分的理论基础。 导航状态 定义导航状态为 Xbn={Rbn,Pbn,Vbn}X^n_b=\{R^n_b,P^n_b,V^n_b\}Xbn​={Rbn​,Pbn​,Vbn​} 上角标n:导航(navigation)坐标系 下角标b:载体(body)坐标系 下文均省略上下标 矢量场与微分方程 对于导航问题我们用如下微分方程描述 X˙(t)=F(t,X)\dot X(t)

南柯一梦的博客 1608

leetcode hot100 之 最长公共子序列

给定两个字符串text1和text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。示例 1:输入:text1 = “abcde”, text2 = “ace”输出:3解释:最长公共子序列是 “ace” ,它的长度为 3。

smallplum123的博客 2775

PyCharm 配置 Anaconda 环境时找不到 python.exe 的解决办法

通过本文的排查步骤与详细解决方案,你应该能够迅速定位并修复 PyCharm 配置 Anaconda 环境时找不到 python.exe 的问题。确保正确设置环境路径、激活目标环境以及手动指定解释器路径是解决此问题的关键。随着开发工具与包管理器的不断更新,类似的问题可能会出现新的变体。持续关注官方文档、社区讨论和版本更新,可以帮助开发者及时适应新变化,并优化工作流程。希望本文提供的分析和代码示例能为你的开发环境配置带来帮助,让你在 PyCharm 与 Anaconda 的高效协同下,专注于创新与代码实现。

s13596191285的博客 3117

【力扣hot100题】最长公共子序列(59)

是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。最长公共子序列是 "ace" ,它的长度为 3。最长公共子序列是 "abc" ,它的长度为 3。两个字符串没有公共子序列,返回 0。是这两个字符串所共同拥有的子序列。,返回这两个字符串的最长。

2303_80799640的博客 338

Pinocchio 快速详细入门教程 —— 开源机器人运动学动力学库

本文介绍了机器人学中的数字机器人学、正逆运动学、动力学仿真与控制、最优控制等核心主题,以及Pinocchio库的应用。内容包括: 数字机器人学:通过UR5机器人模型演示了构型空间采样、碰撞检测、路径规划等基础操作,使用优化方法在约束条件下寻找有效构型。 运动学:详细讲解了二维和三维机器人的正运动学(构型到末端位置)和逆运动学(目标位置到构型),包括串联机械臂和并联机器人的处理。 动力学与控制:介绍了动力学仿真(如自由落体、摩擦效应)、PD控制、计算扭矩控制,以及接触仿真(碰撞检测与处理)。 最优控制:以独轮

机器人控制与仿真应用 2883

PCL 使用点云创建数字高程模型DEM【2025最新版】

使用点云创建数字高程模型DEM,并将结果保存为高程图像。博客长期更新,本文最近更新时间为:2025年9月15日。

点云侠的博客 2294

【力扣hot100题】(093)最长公共子序列

状态转移方程就是当两字符相等是,取俩位置前一个的值加一,否则就直接等于俩位置前一个值。维护二维数组代表截至至两个字符串的某个位置,前面的最长公共子序列长度。还算是挺简单的一题。

s478527548的博客 396

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LeetCode Hot 100 最长公共子序列

0:j] 的最长公共子序列,应取两项中的长度较大的一项,因此 dp[i][j]=max(dp[i−1][j],dp[i][j−1])。[0:i] 为空,空字符串和任何字符串的最长公共子序列的长度都是 0,因此对任意 0≤j≤n,有 dp[0][j]=0;[0:j] 的最长公共子序列,因此 dp[i][j]=dp[i−1][j−1]+1。[0:j] 为空,同理可得,对任意 0≤i≤m,有 dp[i][0]=0。因此动态规划的边界情况是:当 i=0 或 j=0 时,dp[i][j]=0。

2302_76776557的博客 1241

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Leetcode hot 100】1143.最长公共子序列

本文探讨了求解两个字符串最长公共子序列(LCS)的动态规划方法。核心思路是通过定义子问题状态dp[i][j],表示两字符串前缀的LCS长度。当字符相同时扩展子序列,不同时取两种删除情况的最大值。基础解法使用二维数组,时间空间复杂度均为O(mn)。优化解法压缩为一维数组,空间复杂度降至O(min(m,n))。关键点在于合理定义状态转移方程和逆向遍历实现空间优化。

专注Java和MySQL领域知识分享 761

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

leetcode hot100【Leetcode 1143.最长公共子序列】java实现

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

DataCrafter的博客 753

leetcode hot100 最长公共子序列

是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。是这两个字符串所共同拥有的子序列。,返回这两个字符串的最长。这个最难的就是找到递推关系。

chenziang1的博客 196

【Hot100】LeetCode—1143. 最长公共子序列

【代码】【Hot100】LeetCode—1143. 最长公共子序列。

weixin_44382896的博客 545

LeetCode Hot100 1143 最长公共子序列

给定两个字符串text1和text2,返回这两个字符串的最长的长度。如果不存在,返回0。一个字符串的是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。"ace""abcde""aec""abcde"两个字符串的是这两个字符串所共同拥有的子序列。3最长公共子序列是 "ace" ,它的长度为 3。3最长公共子序列是 "abc" ,它的长度为 3。0两个字符串没有公共子序列,返回 0。text2。

2401_87808951的博客 218

力扣hot100 最长公共子序列 LCS 二维DP 空格技巧

超简洁

人言束负兑生|完美是完蛋的开始 717

力扣HOT100之多维动态规划:1143. 最长公共子序列

这道题的子序列可以不连续,所以dp数组的定义和最长重复子数组不一样,我总结出一个规律,**如果涉及到不连续的子序列,那么dp数组的定义就是第一个数组考虑[0,i]范围内元素,第二个数组考虑[0,j]范围内元素的情况下,两个数组之间的公共最长子序列的长度为dp[i][j];如果涉及到连续的子序列,那么dp数组的定义就是,第一个数组以nums1[i]结尾,第二个数组以nums2[j]结尾的情况下,所能得到的最长公共子序列的长度。这道题之前刷代码随想录的时候做过,但是现在又给忘干净了,这道题需要用二维。

weixin_52151595的博客 591
上一篇: 华为机试—最大最小路
下一篇: LeetCode hot 100—最小路径和
rigidwill666
博客等级 码龄7年 508粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rigidwill666

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值