算法第三十二天-最长公共子序列

最长公共子序列

题目要求

在这里插入图片描述

解题思路

求这两个数组或者字符串的最长公共子序列问题,肯定要用到动态规划。

  • 首先区分两个概念:子序列可以是不连续的;子数组(子字符串)是需要连续的;
  • 另外,动态规划也是需要套路的:单个数组或者字符串要用动态规划时,可以把动态规划dp[i]定义为num[0:i]中想要求的结果;当两个数组或者字符串要用动态规划时,可以把动态规划定义成二维的dp[i][j],其含义是在A[0:i]B[0:j]之间匹配得到的想要的结果。

1.状态定义

比如对于本题而言,可以定义dp[i][j]表示text1[0:i-1]text2[0:j-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]时,说明两个字符串的最后一位不相等,那么此时的状态dp[i][j]应该是dp[i-1][j]dp[i][j-1]的最大值。举个例子,比如对于acebc而言,它们的最长公共子序列的长度等于①aceb的最长公共子序列长度0与②acbc的最长公共子序列长度1的最大值,即1.
    综上,状态转移方程为:
  • dp[i][j]=dp[i-1][j-1]+1,当text1[i-1]==text[j-1];
  • dp[i][j]=max(dp[i-1][j],dp[i][j-1]),当text1[i-1]!=text2[j-1]

3.状态的初始化

初始化就是要看当i=0与j=0时,dp[i][j]应该取值为多少;

  • i=0时,dp[0][j]表示的时text1中取空字符串跟text2的最长公共子序列,结果肯定为0;
  • j=0时,dp[i][0]表示的是text2中取空字符串跟text1的最长公共子序列,结果肯定为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],所以i和j的遍历顺序肯定是从小到大的。
另外,由于当i和j取值为0的时候,dp[i][j]=0,而dp数组本身初始化就是为0,所以,直接让i和j从1开始遍历。遍历的结束应该是字符串的长度为len(text1)和len(text2)

5.最终返回结果

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

代码

class Solution:
    def longestCommonSubsequence(self, text1: str, text2: str) -> int:
        M=len(text1)
        N=len(text2)
        dp=[[0]*(N+1)  for _ in range(M+1)]
        for i in range(1,M+1):
            for j in range(1,N+1):
                if text1[i-1]==text2[j-1]:
                    dp[i][j]=dp[i-1][j-1]+1
                else:
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1])
        return dp[M][N]

复杂度分析

时间复杂度: O ( M N ) O(MN) O(MN)
空间复杂度: O ( M N ) O(MN) O(MN)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

制冷设备之转子式压缩机

滚动转子式压缩机又称活塞式压缩机,属于回转式压缩机。 转子压缩机结构 滚动转子式压缩机与往复活塞式压缩机相比,具有下列特点 1.零部件少,尺寸紧凑,结构简单,重量轻易损零件少,运行可靠; 2.…

C语言动态内存的管理

前言 本篇博客就来探讨一下动态内存,说到内存,我们以前开辟空间大小都是固定的,不能调整这个空间大小,于是就有动态内存,可以让我们自己选择开辟多少空间,更加方便,让我们一起来看看动态内存的有…

Vue3 上手笔记

1. Vue3简介 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece(n 经历了:4800次提交、40个RFC、600次PR、300贡献者 官方发版地址:Release v3.0.0 One Piece vuejs/core 截止2023年10月,最…

Linux的一些基本指令

​​​​​​​ 目录 前言: 1.以指令的形式登录 2.ls指令 语法: 功能: 常用选项: 3.pwd指令 4.cd指令 4.1 绝对路径与相对路径 4.2 cd .与cd ..(注意cd后先空格,然后两个点是连一起的&#xff0…

Git bash获取ssh key

目录 1、获取密钥 2、查看密钥 3、在vs中向GitHub推送代码 4、重新向GitHub推送修改过的代码 1、获取密钥 指令:ssh-keygen -t rsa -C "邮箱地址" 连续按三次回车,直到出现类似以下界面: 2、查看密钥 路径:C:\U…

复旦EMBA参访娃哈哈:交流企业创新转型、家族企业管理之道

早在多年前,复旦EMBA同学曾参访娃哈哈集团,与宗庆后先生对话,就国内企业创新转型、家族企业管理之道、“企二代”的成长、企业社会责任等热点问题向其探讨交流。通过面对面的实地企业参访和行业领袖的深入交流,亲身触摸中国科创的…

车辆信息查询API:高效获取车牌号对应车辆的实时信息

随着汽车的普及和交通管理的加强,对于车辆信息的查询需求也越来越大。车辆信息查询API就是为了满足这一需求而开发的,它可以通过输入车牌号,快速获取车辆的相关信息,包括初始登记日期、上险日期、保险到期时间、车架号、品牌等。但…

判断隔离纸到钢壳边缘的距离,燕尾是否超标

方法如下: 方法1:通过找圆工具上的点求解隔离纸边缘点-钢壳边缘点的距离。 #region namespace imports using System; using System.Collections; using System.Drawing; using System.IO; using System.Windows.Forms; using Cognex.VisionPro; using Cognex.VisionPro.To…

[项目前置]websocket协议

websocket协议介绍 WebSocket 协议是一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更简单,允许服务器主动向客户端推送数据。它在 2011 年成为国际标准,现在被所有现代浏览器支持。WebSocket 设计用于…

YOLOv8 | 网络结构 | 详细讲解YOLOv8的网络结构

⭐欢迎大家订阅我的专栏一起学习⭐ 🚀🚀🚀订阅专栏,更新及时查看不迷路🚀🚀🚀 YOLOv5涨点专栏:http://t.csdnimg.cn/70xZa YOLOv8涨点专栏:http://t.csdnimg.cn/Cb89a YOLOv7专栏:http://t.csdnimg.cn/HaTdn 💡魔改网络、复现论文、优化创新💡 …

【No.13】蓝桥杯二分查找|整数二分|实数二分|跳石头|M次方根|分巧克力(C++)

二分查找算法 知识点 二分查找原理讲解在单调递增序列 a 中查找 x 或 x 的后继在单调递增序列 a 中查找 x 或 x 的前驱 二分查找算法讲解 枚举查找即顺序查找, 实现原理是逐个比较数组 a[0:n-1] 中的元素,直到找到元素 x 或搜索整个数组后确定 x 不在…

面试笔记——Redis(双写一致、持久化)

双写一致 双写一致性: 当修改了数据库中的数据,也要更新缓存的数据,使缓存和数据库中的数据保持一致。 相关问题:使用Redis作为缓存,mysql的数据如何与Redis进行同步?——双写一致性问题 回答时&#xff0…

数字范围按位与

链接: 201. 数字范围按位与 - 力扣(LeetCode) 这个题目看起来很难,但是 按位与 的特点是 如果全是1 为 1 其余全为 0 然后这道题其实就是在找最长公共前缀(为啥不说后缀,观察可知,后缀那部分…

【Mysql】硬盘性能压测(Sysbench工具)

1、IOPS和吞吐量介绍 IOPS(每秒输入/输出操作数):是衡量存储设备每秒能够执行的输入/输出操作的数量。对于数据库等需要频繁读写的应用程序而言,IOPS 是一个关键的性能指标。更高的 IOPS 意味着存储设备能够处理更多的读写请求&am…

css盒子模型及浮动

内容(content)、内边距(padding)、边框(border)、外边距(margin) oder:1px solid red; 边框的粗细 边框的样式(虚线还是实线) 边框的颜色 border中也有一些属性可以直接调某一个方向上的边框的粗细,样式,颜色 border-left\bord…

24计算机考研调剂 | 【官方】中国航天系统科学与工程研究院

中国航天系统科学与工程研究院2024年硕士研究生招生预调剂通知 调剂招生信息 研究院概况与专业特色: 中国航天系统科学与工程研究院(简称:十二院)是中国航天科技集团有限公司的直属单位,是在原中国航天工程咨询中心 …

【软考】UML中的图之状态图

目录 1. 说明2. 图示 1. 说明 1.状态图(State Diagram)展现了一个状态机。2.由状态、转换、事件和活动组成。3.关注系统的动态视图。4.对于接口、类和协作的行为建模尤为重要。5.强调对象行为的事件顺序。6.通常包括简单状态和组合状态、转换&#xff0…

十大经典排序算法复杂度、应用场景总结 | 插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序、桶排序、计数排序

前言 好久不见辽,uu们!这几天由于准备专业课的课堂pre,因此一直没能给 “c实现十大经典排序算法” 系列结个尾。本次的十大排序算法包括:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序、桶排序…

递归课堂案例

一个不知名大学生,江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion:2024.03.24 Last edited: 2024.03.24 目录 递归课堂案例 第1关:斐波那契数列 任务描述 相关知识 编程要求 代码如下&#xff1…

java每日一题——买啤酒(递归经典问题)

前言: 非常喜欢的一道题,经典中的经典。打好基础,daydayup!!!啤酒问题:一瓶啤酒2元,4个盖子可以换一瓶,2个空瓶可以换一瓶,请问10元可以喝几瓶 题目如下: 啤酒问题:一瓶…