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

news2025/3/13 6:10:38

题目链接:1143. 最长公共子序列 - 力扣(LeetCode)

前情提要:

如果你做过718. 最长重复子数组 - 力扣(LeetCode)并且看过我的这篇题解力扣718-最长重复子数组(Java详细题解)-CSDN博客,那么做这道题会简单很多。

因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。

dp五部曲。

1.确定dp数组和i下标的含义。

2.确定递推公式。

3.dp初始化。

4.确定dp的遍历顺序。

5.如果没有ac打印dp数组 利于debug。

每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。

题目思路:

本题是要求俩个字符串的最长公共子序列的长度。注意这里的子序列和力扣718. 最长重复子数组的子序列不一样,本题的子序列是可以不连续的,而最长重复子数组是需要连续的。

话不多说,直接开始我们的dp五部曲。

1.确定dp数组和i下标的含义。

dp[i] [j]的含义是以i - 1结尾的字符串与j - 1结尾的字符串最长公共子序列的长度。

至于为什么是i- 1和j - 1大家可以看看这篇力扣718-最长重复子数组(Java详细题解)-CSDN博客。

2.确定递推公式。

本题就难在递推公式。

因为我们要求最长公共子序列,可以是不连续的。

所以主要是俩大情况。一个是nums[i - 1] == nums[j - 1],

另一个就是不等于的情况。

当nums[i - 1] == nums[j - 1]时,说明此时结尾的元素相等,那么此时的最长公共子序列就等于他前一个状态加上相同元素的长度即可.

dp[i] [j] = dp[i - 1] [j - 1] + 1。

当nums[i - 1] != nums[j - 1]时,说明此时结尾的元素不等,那么此时我们就需要删除俩个数组中的最后一位元素。我们需要删除哪一个数组呢?

不知道,但是我们是要求最长的公共子序列的长度,所以我们取一个最大即可。

dp[i] [j] = Math.max(dp[i] [j - 1],dp[i - 1] [j]);

3.dp初始化。

由递推公式可以看出,最长公共子序列不仅由它左上的方向推出还可以由它左和上的方向推出。

所以第一排和第一列是递推的起点,我们就要初始化第一排和第一列。

因为dp[i] [0]和dp[0] [i]是将一个没有意义的字符串和另一个字符串求最长公共子序列,所以他们的长度就为0。

4.确定dp的遍历顺序。

由递推公式可以得出最长公共子序列不仅由它左上的方向推出还可以由它左和上的方向推出。

所以我们的遍历顺序是从左到右,从上到下。

5.如果没有ac打印dp数组 利于debug。

在这里插入图片描述

最终代码:

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        int [][] dp = new int [text1.length() + 1][text2.length() + 1];
        int result = 0;
        for(int i = 1;i <= text1.length();i ++){
            for(int j = 1;j <= text2.length();j ++){
                if(text1.charAt(i - 1) == text2.charAt(j - 1)){
                    //这里与最长重复子数组有一点区别 因为子数组是一种连续的结构 只要有一个不同 那么就不算重复的
                    //但是子序列不同 只要是在某一个界限前 一样的都算
                    //所以这里有俩种情况 当text1.charAt(i - 1) == text2.charAt(j - 1)时 那么就该把长度加一 俩个前一位的最长的公共子序列然后加1
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }//如果不同 也有可能是有公共子序列的 比如 abc 与 ace 虽然最后一位不同 但他们是最长子序列为2
                //所以我们可以把拿abc以c结尾的字符串和ace以c为结尾字符串做对比
                //同理也可以拿abc以b为结尾的字符串与ace以e为结尾字符串做对比
                //抽象就是 最长公共子序列不仅由它左上的方向推出还可以由它左和上的方向推出
                else{
                    dp[i][j] = Math.max(dp[i - 1][j],dp[i][j - 1]);
                }text1.length()
                //这里顺便记录一下最长公共子序列的最大长度 其实也可以不用记录 返回dp[text1.length()][text2.length()]也可以
                    //因为本题所有的dp数组都会更新
                result = Math.max(result,dp[i][j]);
            }
        }
        return result;
    }
}

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2147657.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据新视界 --大数据大厂之SaaS模式下的大数据应用:创新与变革

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

网站在线客服插件配置

使用工具&#xff1a;百度爱番番 下载地址&#xff1a; 百度爱番番—企业的一站式智能营销管家 一、下载百度爱番番APP&#xff0c;注册账号 二、 登录app 三、点击设置——站点设置——新建站点 四、设置站点名称——站点地址——PC站点——确定 五、点击配置好的站点的获取代…

Linux新增用户,对用户提权

文章目录 一、创建用户二、删除用户三、对用户进行提权 一、创建用户 adduser进行创建用户&#xff0c;名字最好不用和指令名称相同。 在创建完用户时最好使用sudo passwd username进行对用户密码的修改. 二、删除用户 userdel进行对用户的删除 三、对用户进行提权 新建用…

电商好用的客服话术

在电商交易中&#xff0c;良好的客户服务至关重要。优质的售前服务能够帮助顾客更好地了解商品&#xff0c;做出明智的购买决策&#xff1b;而高效的售后服务则能提升顾客的满意度和忠诚度。今天给大家分享了一些好用的客服售前售后话术。 一、售前 “质量好”相关话术:亲亲&a…

工厂ERP采购管理,销售管理,仓库管理,财务管理,生产加工管理建设方案和源码实现(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本&#xff0c;并实时掌握各环节的运营状况。 在采购管理方面&#xff0c;系统能够处理采购订单、供应商管理和采购入库等流程&#xff…

基于SSM的宿舍管理系统的设计与实现 (含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的宿舍管理系统9拥有两种角色&#xff1a;管理员和用户 管理员&#xff1a;宿舍管理、学生管理、水电费管理、报修管理、访客管理、各种信息统计报表 用户&#xff1a;个人信息管…

pg 解决锁表问题

SELECT pid, relname, transactionid, mode, granted FROM pg_locksJOIN pg_stat_user_tables ON pg_locks.relation pg_stat_user_tables.relidselect * from pg_stat_activity where datname数据库名 and stateactive查看锁SELECT * FROM pg_stat_activity WHEREwait_even…

xuri/excelize简单使用

main.go文件&#xff1a; package mainimport ("fmt""github.com/xuri/excelize/v2" )func main() {read() // 读excel文件//write() // 写excel文件//readAndWrite() // 读写excel文件 }func read() {f, err : excelize.OpenFile("read.xls…

初写MySQL四张表:(2/4)

今天&#xff0c;我们来写第二张表。因着这四张表以及后续有相应的拓展&#xff0c;这四张环环相扣&#xff0c;所以还未写出第一张表的同学&#xff0c;可以看完第一张表&#xff0c;再来此处&#xff1a; 初写MySQL四张表:(1/4)-CSDN博客 好&#xff0c;今日表格有三张&…

echarts图表一次点击事件却触发多次的解决方法

echarts图表 一次点击事件却触发多次的解决方法 遇到个echarts的问题&#xff0c;点击一次图表却触发多次点击事件&#xff0c;看了下官网介绍了点击事件的解绑事件 let echarts_id document.getElementById("echarts_id");let my_chart this.$echarts.init(echart…

八股文-JVM

是什么&#xff1f;有什么用&#xff1f;谁发明的&#xff1f;什么时候发明的&#xff1f; Java虚拟机&#xff0c;用来运行Java程序&#xff0c;有很多个版本的虚拟机&#xff0c;比如HotSpot&#xff0c;最开始是SUN公司开发人员&#xff0c;和Java一起发布&#xff0c;现在…

VirtualBox增加磁盘并给docker用

在VirtualBox新增磁盘 在虚拟机停止的情况下依次选择&#xff0c;然后创建新磁盘 虚拟机新磁盘创建分区、格式化、挂载分区 开机自动挂载新磁盘分区/dev/sdb1&#xff1a; nano /etc/fstab末尾添加一行&#xff1a; /dev/sdb1 /disk02 e…

leetcode41. 缺失的第一个正数,原地哈希表

leetcode41. 缺失的第一个正数 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 解释&#xf…

基于JavaSwing实现的酒店管理系统

一、项目介绍 > 欢迎使用酒店管理系统&#xff01; > 这是一个基于Java Swing开发&#xff0c;用于管理酒店预订、房间、订单和用户信息的系统。 > 适用于JAVA初学者作为入门学习项目。 二、项目演示 三、基础依赖 技术/框架版本描述Java8编程语言MySQL8.0数据…

ATGM331C-5T杭州中科微全星座定位授时模块电气参数

ATGM331C-5T 系列模块通过 UART 作为主要输出通道&#xff0c;按照 NMEA0183 的协议格式输出。 产品选型&#xff1a; 性能指标&#xff1a; 出色的定位导航功能&#xff0c;支持 BDS/GPS 卫星导航系统的单系统授时&#xff0c;以及任意组合的多系统联合定位&#xff0c;并支持…

yolov5/8/9/10模型在VOC数据集上的应用【代码+数据集+python环境+GUI系统】

yolov5/8/9/10模型在VOC数据集上的应用【代码数据集python环境GUI系统】 1.背景意义 VOC数据集被广泛应用于计算机视觉领域的研究和实验中&#xff0c;特别是目标检测和图像识别任务。许多知名的目标检测算法都使用VOC数据集进行训练和测试。VOC挑战赛&#xff08;VOC Challeng…

倍增练习(1)

A - ST 表 && RMQ 问题 题目思路:st表的板子题用于静态区间求最值,通过倍增的思想,先通过预处理将各个区间的最大值通过转移式求出f[i][j] max(f[i][j - 1], f[i (1 << (j - 1))][j - 1]);然后再进行重叠查询查询,k log2(r - l 1);,max(f[l][k], f[r - (1 &l…

js中两种异步方式:async+await以及then

第一种方式 第二种方式 完整代码 前端代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>pywebv…

金手指设计

"MCP6294"。是一个轨到轨, 带宽为 10MHz 的 低功耗放大器. 对LM358测量 10MHz 范围内的频率特性&#xff0c;在 8MHz 左右&#xff0c;输出相移超过了 180。MCP6294的频率特性&#xff0c;则显示在 10MHz 运放相移之后 100左右。 对比两个运放的频率特性&#xff…

LLM - 理解 多模态大语言模型(MLLM) 的 预训练(Pre-training) 与相关技术 (三)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142167709 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 完备(F…