Leetcode1143. 最长公共子序列

news2024/11/16 15:59:20

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

首先,区分两个概念:子序列可以是不连续的;子数组(子字符串)需要是连续的;
另外,动态规划也是有套路的:单个数组或者字符串要用动态规划时,可以把动态规划 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)官网 - 全球极客挚爱的技术成长平台

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

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

相关文章

威联通QNAP NAS结合cpolar内网穿透实现公网远程访问NAS中存储的文件

文章目录 推荐 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣…

蓝桥杯备赛 week 3 —— 高精度(C/C++,零基础,配图)

目录 &#x1f308;前言&#xff1a; &#x1f4c1; 高精度的概念 &#x1f4c1; 高精度加法和其模板 &#x1f4c1; 高精度减法和其模板 &#x1f4c1; 高精度乘法和其模板 &#x1f4c1; 高精度除法和其模板 &#x1f4c1; 总结 &#x1f308;前言&#xff1a; 这篇文…

WinSCP下载安装并实现远程SSH本地服务器上传文件

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本地与远程计…

中仕教育:公务员省考和国考分别是什么时候?

1. 国考&#xff1a;国考时间基本上是固定的。报名时间一般在每年的10月中下旬&#xff0c;考试时间在11月下旬或12月上旬&#xff0c;面试时间在次年的2—3月。 2. 省考&#xff1a;大部分省份集中在3月至5月&#xff0c;部分省份还会有春秋两次考试。 省考和国考能都报名吗…

Obsidian笔记软件结合cpolar实现安卓移动端远程本地群晖WebDAV数据同步

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

C#,最小生成树(MST)博鲁夫卡(Boruvka)算法的源代码

Otakar Boruvka 本文给出Boruvka算法的C#实现源代码。 Boruvka算法用于查找边加权图的最小生成树&#xff08;MST&#xff09;&#xff0c;它早于Prim和Kruskal的算法&#xff0c;但仍然可以被认为是两者的关联。 一、Boruvka算法的历史 1926年&#xff0c;奥塔卡博鲁夫卡&…

【Flink-1.17-教程】-【四】Flink DataStream API(1)源算子(Source)

【Flink-1.17-教程】-【四】Flink DataStream API&#xff08;1&#xff09;源算子&#xff08;Source&#xff09; 1&#xff09;执行环境&#xff08;Execution Environment&#xff09;1.1.创建执行环境1.2.执行模式&#xff08;Execution Mode&#xff09;1.3.触发程序执行…

米贸搜|Meta广告中级水准:Facebook自动完成四项广告设置,改善投放成效!

广告投放中的机器学习预算自动分配版位自动分配受众自动分配创意灵活调整 一、广告投放中的机器学习 机器学习现已成为数字营销的基础&#xff0c;能够帮助我们面向想要触达的受众投放与之相关的广告。随着我们对如何使用机器学习的了解加深&#xff0c;我们对“如何创建广告…

眼镜清洗机是智商说吗?适合清洗眼镜的超声波清洗机推荐

随着现代生活步伐的加快&#xff0c;对于家居清洁的需求也日益增长。在这个背景下&#xff0c;超声波清洗机成为了现代家庭清洁的好帮手。有的朋友会认识超声波清洗机洗眼镜是智商税&#xff01;其实只要是用过超声波清洗机都知道这不是智商税&#xff0c;眼镜店老板每天用来清…

程序员如何保持身心健康

程序员要保持身心健康&#xff0c;可以注意以下几个方面&#xff1a; 饮食健康&#xff1a;保持均衡的饮食&#xff0c;多吃蔬菜水果&#xff0c;减少油腻和高热量食物的摄入。同时&#xff0c;适当饮水&#xff0c;避免因长时间坐着工作而导致的脱水。尽量不要吃街边摊、大排…

postgresql12表膨胀解决(不锁表)

查看所有数据库占用磁盘空间 SELECTpg_database.datname AS "数据库名称",pg_size_pretty(pg_database_size(pg_database.datname)) AS "磁盘占用空间" FROMpg_database;发现有个数据库占用空间过大 查询库中所有表占用空间 SELECTtable_name,pg_size_…

Chatgpt的崛起之路

Chatgpt的崛起之路 背景与发展历程背景发展历程 技术原理第一阶段&#xff1a;训练监督策略模型第二阶段&#xff1a;训练奖励模型第三阶段&#xff1a;采用强化学习来增强模型的能力。 国内使用情况及应用的领域面临的数据安全挑战与建议ChatGPT获取数据产生的问题数据泄露问题…

【学网攻】 第(8)节 -- 端口安全

文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan【学网攻】 第(5)节 -- Cisco VTP的使用​​​​​​【学网攻】 第(6)节 -- 三层交换机实现VLAN间路由【学网攻…

docker 部署springboot项目

新建Dockerfile ## AdoptOpenJDK 停止发布 OpenJDK 二进制&#xff0c;而 Eclipse Temurin 是它的延伸&#xff0c;提供更好的稳定性 ## 感谢复旦核博士的建议&#xff01;灰子哥&#xff0c;牛皮&#xff01; FROM eclipse-temurin:8-jre## 将后端项目的 Jar 文件&#xff0c…

念念不忘智能编程,必有回响CodeArts Snap

开发者的碎碎念 之前在【我与ModelArts的故事】的文章里&#xff0c;分享过我学习新技术的经历&#xff0c;主要有&#xff1a; 自主学习&#xff0c;比如自学Python&#xff1b;借助华为云的产品边用边学。 在围着"编程学习"这座城池&#xff0c;外围来来回回转了…

springboot126疫情下图书馆管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的疫情下图书馆管理系统 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章…

帕金森既然不是癌症,但又为什么令患者非常的痛苦呢?

帕金森病是一种慢性、进行性的神经系统退行性疾病&#xff0c;主要影响到大脑中负责协调和控制运动的神经元。帕金森病的主要症状包括肢体僵硬、震颤、运动迟缓以及平衡障碍等&#xff0c;给患者的生活和工作带来了很大的困扰和痛苦。 帕金森病的肢体僵硬和运动迟缓是最常见的…

IMX6:pthread_cond_t条件变量测试

简介 pthread_cond_t是一个条件变量的数据类型&#xff0c;用于线程间的同步和通信。它通常与互斥锁&#xff08;pthread_mutex_t&#xff09;一起使用&#xff0c;以实现线程的等待和唤醒操作。 以下是两个与pthread_cond_t相关的函数的介绍&#xff1a; pthread_cond_init&a…

10个免费高质量视频素材网站,无版权,可商用。

推荐10个高清无水印视频素材网站&#xff0c;免费下载&#xff0c;无版权可商用&#xff0c;建议收藏起来&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库虽然是个设计素材网站&#xff0c;但除了设计类素材之外还有很多视频、音频、办公类…

22款奔驰GLS450升级香氛负离子车载香薰功能

奔驰原厂香氛系统激活原车自带系统&#xff0c;将香气加藏储物盒中&#xff0c;通过系统调节与出风口相结合&#xff0c;再将香味传达至整个车厢&#xff0c;达到净化车厢空气的效果&#xff0c;让整个车厢更加绿色健康&#xff0c;清新淡雅。星骏汇小许Xjh15863 产品功能&…