Leetcode1143. 最长公共子序列

LeetCode第1143题最长公共子序列 题目来源 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。 若这两个字符串没有公共子序列,则返回 0。 示例 1: 输入:text1 = “abcde”, text2 = 阅读详情

解题思路
求两个数组或者字符串的最长公共子序列问题,肯定是要用动态规划的。下面的题解并不难,你肯定能看懂。

首先,区分两个概念:子序列可以是不连续的;子数组(子字符串)需要是连续的;
另外,动态规划也是有套路的:单个数组或者字符串要用动态规划时,可以把动态规划 dp[i] 定义为 nums[0:i] 中想要求的结果;当两个数组或者字符串要用动态规划时,可以把动态规划定义成两维的 dp[i][j] ,其含义是在 A[0:i] 与 B[0:j] 之间匹配得到的想要的结果。
1. 状态定义
比如对于本题而言,可以定义 dp[i][j] 表示 text1[0:i-1] 和 text2[0:j-1] 的最长公共子序列。 (注:text1[0:i-1] 表示的是 text1 的 第 0 个元素到第 i - 1 个元素,两端都包含)
之所以 dp[i][j] 的定义不是 text1[0:i] 和 text2[0:j] ,是为了方便当 i = 0 或者 j = 0 的时候,dp[i][j]表示的为空字符串和另外一个字符串的匹配,这样 dp[i][j] 可以初始化为 0.

2. 状态转移方程
知道状态定义之后,我们开始写状态转移方程。

当 text1[i - 1] == text2[j - 1] 时,说明两个子字符串的最后一位相等,所以最长公共子序列又增加了 1,所以 dp[i][j] = dp[i - 1][j - 1] + 1;举个例子,比如对于 ac 和 bc 而言,他们的最长公共子序列的长度等于 a 和 b 的最长公共子序列长度 0 + 1 = 1。
当 text1[i - 1] != text2[j - 1] 时,说明两个子字符串的最后一位不相等,那么此时的状态 dp[i][j] 应该是 dp[i - 1][j] 和 dp[i][j - 1] 的最大值。举个例子,比如对于 ace 和 bc 而言,他们的最长公共子序列的长度等于 ① ace 和 b 的最长公共子序列长度0 与 ② ac 和 bc 的最长公共子序列长度1 的最大值,即 1。
综上状态转移方程为:

dp[i][j]=dp[i−1][j−1]+1dp[i][j] = dp[i - 1][j - 1] + 1dp[i][j]=dp[i−1][j−1]+1, 当 text1[i−1]==text2[j−1];text1[i - 1] == text2[j - 1];text1[i−1]==text2[j−1];
dp[i][j]=max(dp[i−1][j],dp[i][j−1])dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])dp[i][j]=max(dp[i−1][j],dp[i][j−1]), 当 text1[i−1]!=text2[j−1]text1[i - 1] != text2[j - 1]text1[i−1]!=text2[j−1]
3. 状态的初始化
初始化就是要看当 i = 0 与 j = 0 时, dp[i][j] 应该取值为多少。

当 i = 0 时,dp[0][j] 表示的是 text1text1text1 中取空字符串 跟 text2text2text2 的最长公共子序列,结果肯定为 0.
当 j = 0 时,dp[i][0] 表示的是 text2text2text2 中取空字符串 跟 text1text1text1 的最长公共子序列,结果肯定为 0.
综上,当 i = 0 或者 j = 0 时,dp[i][j] 初始化为 0.

4. 遍历方向与范围
由于 dp[i][j] 依赖与 dp[i - 1][j - 1] , dp[i - 1][j], dp[i][j - 1],所以 iii 和 jjj 的遍历顺序肯定是从小到大的。
另外,由于当 iii 和 jjj 取值为 0 的时候,dp[i][j] = 0,而 dp 数组本身初始化就是为 0,所以,直接让 iii 和 jjj 从 1 开始遍历。遍历的结束应该是字符串的长度为 len(text1)len(text1)len(text1) 和 len(text2)len(text2)len(text2)。

5. 最终返回结果
由于 dp[i][j] 的含义是 text1[0:i-1] 和 text2[0:j-1] 的最长公共子序列。我们最终希望求的是 text1 和 text2 的最长公共子序列。所以需要返回的结果是 i = len(text1) 并且 j = len(text2) 时的 dp[len(text1)][len(text2)]。

 

代码如下:

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        int m = text1.length();
        int n = text2.length();
        int[][] dp = new int[m+1][n+1];
        for(int i = 1; i <= m;i++){
            for(int j = 1; j <= n;j++){
                if(text1.charAt(i-1) == text2.charAt(j-1)){
                    dp[i][j] = dp[i-1][j-1]+1;
                }
                else{
                    dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
                }
                
            }
        }
        return dp[m][n];

    }
}

 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

陀螺仪选型避坑指南:为什么IMU660RA是智能车竞赛的性价比之选? 本文针对智能车竞赛场景,提供陀螺仪选型避坑指南,并深度解析为何IMU660RA成为性价比之选。文章指出,竞赛选型应避免盲目追求高性能“黑盒”模块,而应注重原始数据获取与算法开发。IMU660RA以其良好的常温稳定性、适中的噪声水平、极致的性价比和丰富的生态支持,成为帮助参赛者深入理解姿态解算原理、进行“白盒开发”的理想教学与实践平台。 阅读详情

相关推荐

基于zynq在linux下的AXI-CAN实战

从petalinux的搭建,到uboot、kernel、rootfs的调试、打包提示:以下是本篇文章正文内容,下面案例可供参考本次要讲述的zynq的AXI-CAN实战小知识就说到这里了,兄弟萌要有什么指导意见或疑问可以在评论区留下"足迹"。

qq_45521099的博客 3162

LeetCode、1143. 最长公共子序列【中等,二维DP】

LeetCode、1143. 最长公共子序列【中等,二维DP】 题目内容:给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。 两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

每个人都是独一无二的,把握好自己的节奏,跟着自己的心走。 2070

从零开始:在Ubuntu 22.04上配置Isaac Gym Preview 3环境(含常见错误解决方案)

本文提供了在Ubuntu 22.04系统上从零开始配置Isaac Gym Preview 3环境的完整实战指南。内容涵盖NVIDIA驱动安装、Conda环境搭建、CUDA与PyTorch版本精准匹配、Isaac Gym核心安装与验证,并重点介绍了针对四足机器人等复杂系统的强化学习训练环境配置、常见错误解决方案及性能调优技巧,旨在帮助开发者高效部署这一高性能物理仿真平台。

weixin_29048775的博客 391

leetcode 1143:最长公共子序列

leetcode 1143:最长公共子序列 题目描述:求两个子序列的最长公共子序列 输入:text1 = “abcde”, text2 = “ace” 输出:3 解释:最长公共子序列是 “ace”,它的长度为 3。 解题步骤:和leetcode 516:最长回文子序列类似。 1、 状态定义:dp[i][j]其中i表示字符串1的前i个字符,j表示字符串2的前j个字符,dp[i][j]表示s1[0…i...

张毅的博客 413

DIY T12烙铁头驱动难题:用几个电容二极管,搞定NMOS上管驱动(附Multisim仿真)

本文详细介绍了如何利用电荷泵电路解决DIY T12烙铁头驱动中的NMOS上管驱动难题。通过巧妙组合电容和二极管,构建低成本高效的升压电路,实现栅极高压驱动需求。文章包含具体电路设计、元件选型建议、实际搭建注意事项以及Multisim仿真验证,为电子爱好者提供了一套完整的解决方案。

weixin_33640562的博客 334

非线性动力学_用MatCont分析非线性动力学方程组(一)

写在前面:笔者打算写两到三篇系列文章介绍MatCont,此为第一篇《用MatCont分析非线性动力学方程组(一)》。MatCont是一个基于Matlab而开发的免费工具包,专门用来做非线性动力学模型分叉、向量场、周期性等分析,符号(连续性)运算和数值(离散性)运算均适用。该工具的开发及研究项目由比利时Ghent大学的Willy Govaerts教授、荷兰Utrecht大学的Yuri Kuznets...

weixin_39700215的博客 2765

1143. 最长公共子序列 - 力扣(LeetCode)

假定给出两组字符,求出两组字符的最长子序列长度,以及所有的最长子序列子序列子序列是指一个序列中的元素按照一定顺序排列而得到的新序列,这些元素不一定相邻。比如,序列 [1, 3, 5] 的子序列有 [1, 5]、[3, 5]、[1, 3, 5] 等,其中 [1, 3, 5] 是它的最长子序列。需要注意的是,子序列与子集的概念是不同的,子集是指序列中任意个数的元素组成的集合,包括空集和原序列,而子序列必须按顺序选取若干元素才能得到。

goal66的博客 305

ACC自适应巡航功能

自适应巡航功能(Adaptive Cruise Control)通过传感器检测车辆前方形式环境,控制自车行驶速度以达到定速巡航、跟车巡航、跟车启停,并支持超车辅助等功能。1. 定速巡航一般可设置车辆在30~150km/h的定速范围内巡航2. 跟车巡航车速0~150km/h范围内的跟车巡航3. 跟车启停30s内:自车随之起步,驾驶员无需操作30s~600s内:驾驶员按钮激活 或 轻踩加速踏板激活起步600s后:ACC退出激活状态进入待激活状态,电子驻车制动EPB会自动启动4. 超车辅助。

LXY_LXY_的博客 1383

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

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

DataCrafter的博客 753

SpringBoot实战教程-springboot概论

Spring Boot 是一个快速开发框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,以及自动配置。内置web容器,帮助开发者能够实现快速开发,简化了应用系统的初始搭建以及开发过程。

鸟哥哥的专栏 4155

2025年数学建模国赛高教社杯A题、B题、C题、D题、E题详细思路和代码 模型||插值与拟合

核心思想:构造一个精确通过所有已知离散数据点(xi, yi)的函数y = f(x),并以此函数来估算或预测未知点的值。基本假设:我们认为已知的数据点是100%精确、无误差的(或者误差可忽略不计),比如理论计算值、高精度仪器测量值等。我们的目标是“还原”或“重建”出点与点之间的真实函数关系。关键特征精确性:曲线或曲面必须穿过每一个样本点。局部性:插值结果严重依赖于局部数据点的分布和数值。用途:用于“补全”数据、填充缺失值、进行函数近似等。常见方法多项式插值:拉格朗日插值、牛顿插值。

2201_76125261的博客 802

算法入门 经典DP 力扣1143 最长公共子序列 拓展最长子串 Java

它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。那么 dp[i][j] 的状态只能由 dp[i-1][j-1] 得到。那么 dp[i][j] 的状态只能由 dp[i-1][j-1] 得到。否则则顺延 dp[i-1][j] 和 dp[i][j-1]在字符串中可以不是连续的。

多多的博客 495

一文整理深度学习【深度学习linux的docker+pytorch+cuda+nvidia-docker+vscode配置】

docker+pytorch+cuda+nvidia-docker+vscode

Edward的博客 1334

golang力扣leetcode 1143.最长公共子序列

1143.最长公共子序列1143.最长公共子序列题解代码 1143.最长公共子序列 1143.最长公共子序列 题解 LCS //state: dp[i][j]表示test1的前i个字符和test2的前j的字串的最长公共子序列 //function: dp[i][j]=dp[i-1][j-1]+1或者=dp[i-1][j]或者=dp[i][j-1] //intialize:dp[0][0]=0 //answer: dp[len(text1)][len(text1)] 代码 package main func

清风 1201

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

VB摄像头监控

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

【算法】力扣【动态规划,LCS模板】1143. 最长公共子序列

动态规划提供了一种有效的方法,该方法通过分解为更小的子问题,并存储这些子问题的解来避免重复计算。使用动态规划求解LCS问题,我们通常使用选或不选子序列中的某一元素的思路来推导最长公共子序列中的元素组成,可以通过将两个串的长度作为问题规模看待,自顶向下地不断减小问题规模,再自底向上地利用子问题的解得到原问题的解。该题目要求计算两个字符串的最长公共子序列(Longest Common Subsequence,简称LCS)的长度。字符串的子序列是指在不改变字符顺序的情况下,通过删去某些字符后形成的新字符串。

未来就在脚下。 1506

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

最长公共子序列--LeetCode 1143

最长公共子序列–LeetCode 1143 题目 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列。若这两个字符串没有公共子序列,则返回 0。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde...

何时立秋的博客--向前有路,未来可期 249

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LeetCode1143 最长公共子序列

文章目录一. 题目描述二. 解题思路三. 代码 一. 题目描述 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。 若这两个字符串没有公共子序列,则返回 0。 来源:力扣(

weixin_43849063的博客 329

leetcode1143.最长公共子序列

这是一道典型的两个数组的dp问题。

weixin_74006549的博客 663

力扣1143-最长公共子序列(Java详细题解)

注意这里的子序列和力扣718. 最长重复子数组的子序列不一样,本题的子序列是可以不连续的,而最长重复子数组是需要连续的。当nums[i - 1] == nums[j - 1]时,说明此时结尾的元素相等,那么此时的最长公共子序列就等于他前一个状态加上相同元素的长度即可.因为dp[i] [0]和dp[0] [i]是将一个没有意义的字符串和另一个字符串求最长公共子序列,所以他们的长度就为0。dp[i] [j]的含义是以i - 1结尾的字符串与j - 1结尾的字符串最长公共子序列的长度。所以主要是俩大情况。

2302_79761426的博客 1263

动态规划——LeetCode 1143. 最长公共子序列

LeetCode 1143. 最长公共子序列题目描述分析代码 题目描述 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-common-subsequence 著作权

qq_33854211的博客 270

力扣每日一题:1143. 最长公共子序列

目录题目:1143. 最长公共子序列示例1示例2示例3解题思路解题代码解题感悟 题目:1143. 最长公共子序列 难度: 中等 题目: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。 两

aruewds的博客 385

Leetcode #1143 最长公共子序列

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

SChenlyx 278

【LeetCode练习】[中等]1143. 最长公共子序列

【LeetCode练习】[中等]1143. 最长公共子序列 1143. 最长公共子序列 1143. 最长公共子序列 算法思想:字符串,动态规划 题目: 分析: java代码 class Solution { //运用动态规划知识 public int longestCommonSubsequence(String text1, String text2) { int M = text1.length(); int N = text2.length(); int[][] dp

qq_39457586的博客 231

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

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

weixin_44382896的博客 545

力扣-1143.最长公共子序列

先初始化后遍历不同,这道题一边遍历,一边计算。

weixin_46878941的博客 339

LeetCode 1143.最长公共子序列

LeetCode 1143.最长公共子序列(LCS) 双序列型 确定状态: 设字符串为s1和s2,长度分别为m和n。 此时LCS长度为l 存在三种情况: s1[i]此时不在LCS中,是多余的 s2[j]此时不在LCS中,是多余的 s1[i]==s2[j],此时l=l+1 状态:设f[i][j]为s1前i个字符和s2前j个字符的LCS长度 转移方程: f[i][j]=max{ f[i-1][j]...

未命名 301
上一篇: Python json.loads()和json.dumps()函数作用
下一篇: Appium自动化测试系列: 1. Mac安装配置Appium
魑魅魍魉114
博客等级 码龄10年 165粉丝 240原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值