两个字符串的最长 公共子序列

给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

  • 例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。

两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

示例 1:

输入:text1 = "abcde", text2 = "ace" 
输出:3  
解释:最长公共子序列是 "ace" ,它的长度为 3 。

示例 2:

输入:text1 = "abc", text2 = "abc"
输出:3
解释:最长公共子序列是 "abc" ,它的长度为 3 。

示例 3:

输入:text1 = "abc", text2 = "def"
输出:0
解释:两个字符串没有公共子序列,返回 0 。

提示:

  • 1 <= text1.length, text2.length <= 1000
  • text1 和 text2 仅由小写英文字符组成。

class Solution {
public:int longestCommonSubsequence(string text1, string text2) {int m = text1.length(), n = text2.length();vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {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];
}
};

 

定义一个二维数组 dp,大小为 (m+1) x (n+1)。其中 dp[i][j] 表示 text1 的前 i 个字符和 text2 的前 j 个字符的最长公共子序列的长度。

如果 text1[i-1] == text2[j-1],则 dp[i][j] = dp[i-1][j-1] + 1,即找到一个新的公共字符,LCS 长度增加 1。

如果 text1[i-1] != text2[j-1],则 dp[i][j] = max(dp[i-1][j], dp[i][j-1]),即比较删除 text1 的最后一个字符或 text2 的最后一个字符时哪个 LCS 更长。

举例:text1 = "abcde"; text2 = "ace";

    • i = 1j = 1 时,text1[0] = 'a'text2[0] = 'a' 相等,dp[1][1] = dp[0][0] + 1 = 1

    • i = 1j = 2 时,text1[0] = 'a'text2[1] = 'c' 不相等,dp[1][2] = max(dp[0][2], dp[1][1]) = 1

    • i = 1j = 3 时,text1[0] = 'a'text2[2] = 'e' 不相等,dp[1][3] = max(dp[0][3], dp[1][2]) = 1

    • i = 2j = 1 时,text1[1] = 'b'text2[0] = 'a' 不相等,dp[2][1] = max(dp[1][1], dp[2][0]) = 1

    • i = 2j = 2 时,text1[1] = 'b'text2[1] = 'c' 不相等,dp[2][2] = max(dp[1][2], dp[2][1]) = 1

    • i = 2j = 3 时,text1[1] = 'b'text2[2] = 'e' 不相等,dp[2][3] = max(dp[1][3], dp[2][2]) = 1

    • i = 3j = 1 时,text1[2] = 'c'text2[0] = 'a' 不相等,dp[3][1] = max(dp[2][1], dp[3][0]) = 1

    • i = 3j = 2 时,text1[2] = 'c'text2[1] = 'c' 相等,dp[3][2] = dp[2][1] + 1 = 2

    • i = 3j = 3 时,text1[2] = 'c'text2[2] = 'e' 不相等,dp[3][3] = max(dp[2][3], dp[3][2]) = 2

    • i = 4j = 1 时,text1[3] = 'd'text2[0] = 'a' 不相等,dp[4][1] = max(dp[3][1], dp[4][0]) = 1

    • i = 4j = 2 时,text1[3] = 'd'text2[1] = 'c' 不相等,dp[4][2] = max(dp[3][2], dp[4][1]) = 2

    • i = 4j = 3 时,text1[3] = 'd'text2[2] = 'e' 不相等,dp[4][3] = max(dp[3][3], dp[4][2]) = 2

    • i = 5j = 1 时,text1[4] = 'e'text2[0] = 'a' 不相等,dp[5][1] = max(dp[4][1], dp[5][0]) = 1

    • i = 5j = 2 时,text1[4] = 'e'text2[1] = 'c' 不相等,dp[5][2] = max(dp[4][2], dp[5][1]) = 2

    • i = 5j = 3 时,text1[4] = 'e'text2[2] = 'e' 相等,dp[5][3] = dp[4][2] + 1 = 3

  • 返回结果
    最终,dp[5][3] = 3,这意味着 "abcde""ace" 的最长公共子序列长度为 3。

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

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

相关文章

Unity Apple Vision Pro 自定义手势识别交互

Vision Pro 是可以使用Unity 提供的XR Hand SDK,可通过XR Hand制作自定义手势识别&#xff0c;通过识别出不同的手势做自定义交互 效果预览 在VisionPro中看VisionPro|手势交互|自定义手势识别 Unity Vision Pro 中文课堂教程地址&#xff1a; Unity3D Vision Pro 开发教程【…

2024全网最详细CTF入门指南、CTF夺旗赛使用工具及刷题网站

2024年最新的CTF&#xff08;Capture The Flag&#xff0c;夺旗赛&#xff09;入门指南如下&#xff0c;涵盖了入门思路、常见题型及练习网站推荐&#xff0c;帮助你逐步了解并提升在CTF中的解题技巧。 如果你对网络安全入门感兴趣&#xff0c;我给大家整理好了相关资料&#…

vmware ubuntu根分区扩容

从你的 fdisk -l 输出来看&#xff0c;系统的 /dev/sda 是你的主要磁盘&#xff0c;大小为 80 GB&#xff0c;分为三个分区&#xff1a; /dev/sda1&#xff1a;1 MB 的 BIOS 引导分区/dev/sda2&#xff1a;2 GB 的 Linux 文件系统分区/dev/sda3&#xff1a;78 GB 的 Linux 文件…

Unity3D ScrollView 滚动视图组件详解及代码实现

在Unity3D中&#xff0c;ScrollView&#xff08;滚动视图&#xff09;是一种常用的UI组件&#xff0c;它允许用户通过滚动来查看超出当前视图范围的内容。ScrollView通常用于显示长列表、大量文本或图像等。本文将详细介绍Unity3D中的ScrollView组件&#xff0c;并提供代码实现…

Java集合剖析2】Java集合底层常用数据结构

一、数据结构与集合 接下来就要学习集合具体的实现类了&#xff0c;集合的实现类底层可能用1种或多种数据结构来存储数据。所以在学习集合的实现类前&#xff0c;我们有必要了解一下一些常见的数据结构&#xff0c;这样我们在后面查看集合实现类的底层源码时&#xff0c;才不会…

项目模块三:Socket模块

一、模块设计 1、套接字编程常用头文件展示 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <fcntl.h> 2、成员函数设计 &#xff08;1&#xf…

题目:连续子序列

解题思路&#xff1a; 首先&#xff0c;不能使用暴力枚举&#xff0c;时间为O(n2)&#xff0c;超时。以下为正确做法&#xff1a; 假设找到一段区间&#xff08;其和>m&#xff09;&#xff0c;如上图黄色部分&#xff0c;那么该区间加上i后面的元素形成的新区间和都>m&a…

Excel中如何进行傅里叶变换(FT),几步完成

在 Excel 中&#xff0c;虽然没有像 MATLAB 那样专门的函数库来直接进行傅里叶变换&#xff0c;但可以使用 Excel 内置的分析工具库提供的傅里叶变换&#xff08;FT &#xff0c;Fourier Transform&#xff09;功能。这个工具可以对数据进行频域分析。以下是如何在 Excel 中进行…

【.net core使用minio大文件分片上传】.net core使用minio大文件分片上传以及断点续传、秒传思路

版本&#xff1a;.net core 7 需求&#xff1a;net限制了上传的大小&#xff0c;只能上传25M上下的文件&#xff0c;如果上传一个八十多兆的文件&#xff0c;swagger接口报错&#xff0c;如果前端调用上传接口&#xff0c;会报CORS跨域错误&#xff0c;这篇文章介绍怎么使用分片…

C#学习笔记(九)

C#学习笔记&#xff08;九&#xff09; 第六章 面向对象编程&#xff08;一&#xff09;类与对象、字段与属性一、类与对象正确的理解1. 什么是类&#xff1f;2.什么是对象&#xff1f;3. 类与对象的区别 二、类的基本规范和对象使用1. 类的规范 三、类的访问修饰符&#xff08…

GoFly快速开发框架的utils-plugin扩展包开发演示教程

说明 本插件是教大家如何开发框架utils->plugin下扩展插件包&#xff0c;在开发时可安装本插件&#xff0c;参考本插件代码结构写你插件&#xff0c;这样可以达到规范插件代码&#xff0c;同时也也是为了兼容你安装其他人在代码仓通过扩展插件包&#xff0c;如果不规范可能…

Bolt 一款AI 全栈 Web 在线开发工具

参考&#xff1a; https://bolt.new/ github项目也可以支持Bolt在线打开编辑 直接连接前输入&#xff0c;比如 https://github.com/lyz1810/live2dSpeek更换成 https://bolt.new/github.com/lyz1810/live2dSpeek https://bolt.new/github.com/oh-my-live2d/oh-my-live2d 主要偏…

eUSB2规范介绍

一、说明 eUSB的全称是Embedded USB2,也支持低速、全速和高速三个速率,不过降低了电压幅值,从而使SOC更小、功耗更低,主要应用在芯片间互联,如需应用在设备间传输,一般需要加中继器。 eUSB2还支持USB2.0协议,仅物理层要求不同。 eUSB2支持2个模式:原生模式(native m…

深度学习基础知识-02 数据预处理

深度学习的数据预处理通常包括&#xff1a; 1.数据清洗&#xff1a;去除错误或不完整的数据。 2.归一化&#xff1a;调整数据范围&#xff0c;如将像素值缩放到0-1。 3.数据增强&#xff1a;通过旋转、缩放等方法增加数据多样性。 4.数据划分&#xff1a;将数据分为训练集、验证…

Flume面试整理-Flume与其他数据收集工具的比较

Apache Flume 是一个流行的数据收集工具,但在大数据领域,还有许多其他工具可用于数据收集和传输,如 Apache Kafka、Logstash、Filebeat 等。每个工具都有其独特的优势和使用场景。下面是 Flume 与其他常见数据收集工具的详细比较,包括功能、性能、扩展性等多个方面。 1. Fl…

[C#][winform]基于yolov8的道路交通事故检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面

【重要说明】 该系统以opencvsharp作图像处理,onnxruntime做推理引擎&#xff0c;使用CPU进行推理&#xff0c;适合有显卡或者没有显卡windows x64系统均可&#xff0c;不支持macOS和Linux系统&#xff0c;不支持x86的windows操作系统。由于采用CPU推理&#xff0c;要比GPU慢。…

Turn-it:调整它:优化线材重构雕塑制造

&#x1f428;文章摘要abstract 电线雕塑在工业应用和日常生活中都很重要。 本文提出了一种新的制造策略&#xff0c;通过调整目标形状以适应电线弯曲机&#xff0c;然后由人工将其弯曲回目标形状。&#xff08;机器弯曲人工弯曲&#xff09; 该方法通过两阶段弯曲策略实现&a…

矩阵相关算法

矩阵旋转90度 给定一个 n n 的二维矩阵 matrix 表示一个图像&#xff0c;请你将图像顺时针旋转 90 度。 #include <iostream> #include <vector>using namespace std;void rotate(vector<vector<int>>& matrix) {int n matrix.size();// 第一步…

tsp 车联网功GB32960

https://github.com/zhengyishan/tsp 基于GB32960协议数据接入网关 dyy-gateway-server 功能:车联网数据接入网关主要技术:Netty,Kafka,内存Redis二级缓存/订阅发布特点:高性能,高并发,高可用,支持K8S同POD多副本集群部署,横向拓展扩容测试简介:基于4c8g云虚拟主机,IO密集型机…

王爽汇编语言第三版实验2

实验任务 (1)使用Debug&#xff0c;将下面的程序段写 入程序&#xff0c;逐条进行&#xff0c;根据指令执行后的实际运行情况填空。 mov ax,ffff mov ds,ax mov ax,2200 mov ss,ax mov sp,0100 mov ax,[0] ;axC0EAH add ax,[2] ;axCOFCH mov bx,[4] ;bx30F0H add …