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

最长公共子序列

题目要求

在这里插入图片描述

解题思路

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

  • 首先区分两个概念:子序列可以是不连续的;子数组(子字符串)是需要连续的;
  • 另外,动态规划也是需要套路的:单个数组或者字符串要用动态规划时,可以把动态规划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/464774.html

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

相关文章

2024年腾讯云免费服务器4核8G配置申请

腾讯云免费服务器4核8G配置申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云服务器网txyfwq.com分享2024年最新腾…

OpenAI Q-Star:AGI距离自我意识越来越近

最近硅谷曝出一份54页的内部文件,揭露了去年OpenAI宫斗,导致Altman(奥特曼)差点离职的神秘项目——Q-Star(神秘代号Q*)。 根据该文件显示,Q-Star多模态大模型拥有125万亿个参数,比现…

【GPT-SOVITS-01】源码梳理

说明:该系列文章从本人知乎账号迁入,主要原因是知乎图片附件过于模糊。 知乎专栏地址: 语音生成专栏 系列文章地址: 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

RuiYi-Vue开源项目1-下载并实现运行RuiYi-Vue项目

下载并实现运行RuoYi项目 RuiYi-Vue介绍环境需要下载项目项目配置后端项目配置前端项目配置 启动后前端登录页面截图 RuiYi-Vue介绍 RuoYi-Vue 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring Security、MyBatis、Jwt、Vue&a…

clickhouse学习笔记01(小滴课堂)

老王经历-数据库架构演变历史 你是否能分清OLTP和OLAP系统 急速掌握-数据库里面行存储和列式存储 新一代列式存储ClickHouse介绍和应用场景说明 Linux服务器容器化部署ClickHouse实战 记得要在安全组里配置开放端口号。 到这我们就安装完了。 简单使用: 创建你的第…

P1093 [NOIP2007 普及组] 奖学金

[NOIP2007 普及组] 奖学金 题目背景 NOIP2007 普及组 T1 题目描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 5 5 5 名学生发奖学金。期末,每个学生都有 3 3 3 门课的成绩:语文、数学、英语。先按总分从高到低排…

关于volatile与指令重排序的探讨

写在开头 在之前的学习我们了解到,为了充分利用缓存,提高程序的执行速度,编译器在底层执行的时候,会进行指令重排序的优化操作,但这种优化,在有些时候会带来 有序性 的问题。 那何为有序性呢?…

Gin 框架中前端向后端传值的几种方式介绍

我将为您详细讲解 Gin 框架中前端向后端传值的几种方式,并给出相应的简单例子。Gin 是一个高性能的 Web 框架,用于构建后端服务。在 Web 应用程序中,前端通常需要向后端发送数据,以便后端能够进行处理。以下是几种常见的前端向后端…

数据可视化学习:Matplotlib概述

一、图表的常用设置 1.基本绘图主要函数 (1).matplotlib.pyplot.plot(x,y,format_string,**kwargs) 2.参数说明 (1).x:x轴数据 (2).y:y轴数据 (3).format_string:控制曲线格式的字符串,包括颜色、线条样式和标记样式 (4)**kwargs:键值参数,相当于…

go rabbitmq 操作

go rabbitmq 操作 go 依赖包github.com/streadway/amqp docker快速部署 docker pull rabbitmq:management docker run -d rabbitmq:management # 先跑一个看看监听了哪些端口 docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq #5672 go 程序连接&#x…

TPU浅谈

前言 大家好,我是jiantaoyab,上篇文章讲了FPGA和ASIC,讲解了 FPGA 如何实现通过“软件”来控制“硬件”,以及我们可以进一步把 FPGA 设计出来的电路变成一块 ASIC 芯片。今天我们来看看TPU。大家可以点击这篇文章TPU深入了解TPU。…

操作系统(OS)

文章目录 前言一、操作系统是什么?二、用户对资源的访问三、操作系统是怎么做到管理的? 前言 任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。冯诺依曼体系结构中的硬件单元提供的功能,这些硬件由操作系统来控制与管…

ChatGPT登陆提示:“Please unblock challenges.cloudflare.com to proceed…”

ChatGPT登陆时提示:“Please unblock challenges.cloudflare.com to proceed”, 说明:请解除对challenges.cloudflare.com的屏蔽以继续 原因及解决方法: 1、出现这个问题,一般都是网络和本地环境问题,可以…

Seata 2.x 系列【7】服务端集成 Nacos 2.x

有道无术,术尚可求,有术无道,止于术。 本系列Seata 版本 2.0.0 本系列Spring Boot 版本 3.2.0 本系列Spring Cloud 版本 2023.0.0 源码地址:https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 概述2. 安装 N…

滑动窗口最大值(leetcode hot100)

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums [1,3,-1,-3,5,3,6,7], k 3 输…

mvnd 安装和配置

mvnd 是 maven 的增强工具,在执行速度方面优于 maven 下载安装: https://github.com/apache/maven-mvnd/releases/ 根据不同的系统下载不同的安装包 配置环境变量 Path 新增 mvnd 安装路径下的 bin 目录 E:\maven-mvnd-1.0-m8-m39-windows-amd64\b…

学会Promise,看这里!!!

前言 众所周知,在JavaScript的世界中,代码都是单线程执行的。由于这个原因,JavaScript中的耗时操作,如网络操作、浏览器事件等,都需要异步执行。这也导致在JavaScript中异步操作是非常频繁且常见的。 异步&#xff1a…

B端能用就行,颜值无所谓?你现在还敢说吗,马上轮到工业HMI

在当前的商业环境下,用户体验和界面设计的重要性越来越受到重视,即使是B端用户也希望能够使用界面美观、易于操作的工业HMI系统。 漂亮的设计不仅可以提高用户的工作效率和满意度,还可以提升产品的竞争力和市场份额。因此,即使是…

Java 面试题之框架

1. Spring 是什么 Sping 是包含了众多工具方法的 IOC 容器,IOC是控制反转,说的是对象的创建和销毁的权利都交给 Spring 来管理了, 它本身又具备了存储对象和获取对象的能力. 。 容器:字面意思,用来容纳某种物品的装置。 比如 L…

力扣题目训练(22)

2024年2月15日力扣题目训练 2024年2月15日力扣题目训练563. 二叉树的坡度637. 二叉树的层平均值643. 子数组最大平均数 I304. 二维区域和检索 - 矩阵不可变154. 寻找旋转排序数组中的最小值 II 2024年2月15日力扣题目训练 2024年2月15日第二十二天编程训练,今天主要…