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

最长公共子序列

题目要求

在这里插入图片描述

解题思路

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

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

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

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

相关文章

WorkPlus Meet局域网视频会议软件的领先解决方案

局域网视频会议软件在现代企业中发挥着重要的作用,而在众多选项中,为何选择WorkPlus Meet作为局域网视频会议软件? 选择局域网视频会议软件时需要考虑到企业的需求。WorkPlus Meet提供了稳定、高效的局域网视频会议功能,能够满足…

前端工程化(二)(精品、面试必备基础)(春招、秋招)

目录 什么是模块化?CommonJS规范和Node关系模块化的核心exports 导出 & require 导入模块加载(持续更新) 什么是模块化? 事实上模块化开发最终的目的是将程序划分成一个个小的结构; 这个结构中编写属于自己的逻辑代码,有自己的作用域,…

云服务器2核4G5M配置代表什么意思?

腾讯云服务器2核4G5M带宽配置是代表什么?代表2核CPU、4G内存、5M公网带宽,这是一款轻量应用服务器,系统盘为60GB SSD云硬盘,活动页面 txybk.com/go/txy 活动打开如下图: 腾讯云2核4G5M服务器 如上图所示,这…

汽车电子零部件(6):DMS/OMS、CMS

前言: 有一个部件过去不曾有,而如今有可能要标准化标配化,那就是Driver Monitoring System (DMS)驾驶员监控系统、Occupant Monitoring System (OMS)乘客监控系统和Camera Monitor System(CMS)摄像头监控系统。 汽车视觉技术的创新推动先进驾驶辅助系统的变革(ADAS),并…

Linux_基础指令(一)

目录 1、ls指令 1.1 ls -l 1.2 ls -a 1.3 ls -i 2、pwd指令 3、cd指令 3.1 路径的概念 3.1.1 绝对路径 3.1.2 相对路径 3.2 cd ~ 3.3 cd - 4、touch指令 5、mkdir指令 6、删除系列的指指令 6.1 rmdir 6.2 rm 7、man指令 8、cp指令 9、move指令 结…

Prometheus 轻量化部署和使用

文章目录 说明Prometheus简介Grafana简介prometheus和Grafana的关系环境准备(docker)docker安装时间时区问题(我的代码中)dockers镜像加速和服务器时区设置 数据库准备(mysql、redis)mysql配置redis配置 Prometheus、grafana下载和…

最小化战斗力差距——算法思路

题目链接:1.最小化战斗力差距 - 蓝桥云课 (lanqiao.cn) 可分析,把一个数组分成两组,求一组的最大值与另一组的最小值的差值的绝对值最小,可以转换为求任意两个相邻数字之间的最小插值的绝对值。 可看图示: package lan…

一文速通ESP32(基于MicroPython)——含示例代码

ESP32 简介 ESP32-S3 是一款集成 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE) 的 MCU 芯片,支持远距离模式 (Long Range)。ESP32-S3 搭载 Xtensa 32 位 LX7 双核处理器,主频高达 240 MHz,内置 512 KB SRAM (TCM),具有 45 个可编程 GPIO 管…

App推广不再难!Xinstall神器助你快速获客,提升用户留存

在如今的移动互联网时代,App推广已经成为了各大应用商家争夺用户的重要手段。然而,面对竞争激烈的市场环境,如何快速提升推广效率,先人一步获得用户呢?这就需要我们借助专业的App全渠道统计服务商——Xinstall的力量。…

MySQL 多表查询强化练习

环境准备 create table dept(id int PRIMARY KEY,dname VARCHAR(50),loc VARCHAR(50) ); insert into dept values (10,研发部,北京), (20,学工部, 上海), (30,销售部,广州 ), (40,财务部,深圳);create table job(id int PRIMARY KEY,jname VARCHAR(20),descripition VARCHAR(…

机器学习——压缩网络作业

文章目录 任务描述介绍知识蒸馏网络设计 Baseline实践 任务描述 网络压缩:使用小模型模拟大模型的预测/准确性。在这个任务中,需要训练一个非常小的模型来完成HW3,即在food-11数据集上进行分类。 介绍 有许多种网络/模型压缩的类型&#xff0…

ElasticSearch常见用法,看这一篇就够了(文末送书)

2024送书福利正式起航 关注「哪吒编程」,提升Java技能 文末送3本《一本书讲透Elasticsearch:原理、进阶与工程实践》 大家好,我是哪吒。 ElasticSearch是一款由Java开发的开源搜索引擎,它以其出色的实时搜索、稳定可靠、快速安…

【Linux】进程与可执行程序的关系fork创建子进程写实拷贝的理解

一、进程与可执行程序之间关系的理解 系统会将此时在系统运行的进程的各种属性都以文件的形式给你保存在系统的proc目录下。运行一个程序的时候,本质就是把磁盘中的程序拷贝到内存中,当一个进程运行起来的时候,它本质已经和磁盘中的可执行程序…

Epuck2 在 ROS 下的运动控制

文章目录 前言一、初始配置二、运动控制三、移动机器人总结 前言 在对Epuck2机器人进行完固件更新及IP地址查询后,接下来通过ROS来对Epuck2机器人进行运动控制。 一、初始配置 (1)创建一个 catkin 工作空间 mkdir -p ~/catkin_ws/src cd ~…

cmd常用指令

cmd全称Command Prompt,中文译为命令提示符。 命令提示符是在操作系统中,提示进行命令输入的一种工作提示符。 在不同的操作系统环境下,命令提示符各不相同。 在windows环境下,命令行程序为cmd.exe,是一个32位的命令…

通俗易懂的Python循环讲解

循环用于重复执行一些程序块。从上一讲的选择结构,我们已经看到了如何用缩进来表示程序块的隶属关系。循环也会用到类似的写法。 for循环 for循环需要预先设定好循环的次数(n),然后执行隶属于for的语句n次。 基本构造是 for 元素 in 序列: statemen…

ClickHouse中的设置的分类

ClickHouse中的各种设置 ClickHouse中的设置有几百个,下面对这些设置做了一个简单的分类。

C语言疑难题:杨辉三角形、辗转相除求最大公约数、求π的近似值、兔子问题、打印菱形

杨辉三角形&#xff1a;打印杨辉三角形的前10行 /* 杨辉三角形&#xff1a;打印杨辉三角形的前10行 */ #include<stdio.h> int main(){ int i,j; int a[10][10]; printf("\n"); for(i0;i<10;i){ a[i][0]1; a[i][i]1; …

提升Java IO性能!探究BufferedOutputStream的奥秘

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java IO相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

【系统架构师】-第4章-信息安全技术

1、基础知识 五要素&#xff1a; (1)机密性&#xff1a;确保信息不暴露给未授权的实体或进程。 (2)完整性&#xff1a;只有得到允许的人才能修改数据&#xff0c;并且能够判别出数据是否已被篡改。 (3)可用性&#xff1a;得到授权的实体在需要时可访问数据&#xff0c;即攻击…