力扣1143. 最长公共子序列(动态规划)

Problem: 1143. 最长公共子序列

文章目录

  • 题目描述
  • 思路
  • 解题方法
  • 复杂度
  • Code

题目描述

在这里插入图片描述在这里插入图片描述

思路

我们先假设已经将两个字符串转换为两个char类型的数组(t1,t2)便于比较

1.如果t1[i] == t2[j],有三种决策:(i+1,j+1),(i+1, j), (i, j+1); (i,j表示当前待比较的字符;"i+1"即表示指向t1数组中的一字符的下一个)
如果t1[i] != t2[j],有三种决策:(i+1,j+1),(i+1, j), (i, j+1);
2.达到(i,j)这个状态,也就是说:开始匹配t1[i]和t2[j]了,只可能从上一个阶段的这几个阶段转移过来:(i-1, j),(i, j-1), (i - 1, j - 1);

如果状态时(i-1,j),那么i+1,j不变,则得到(i,j)这个状态;
如果状态时(i,j-1),那么i不变,j+1,则得到(i,j)这个状态;
如果状态时(i-1,j-1),那么i+1,j+1,则得到(i,j)这个状态;

3.int dp[n + 1][m + 1];(其中n表示字符串text1的长度,m表示字符串text2的长度);

dp[i][j]表示长度为i的text1的子串和长度为j的text2的子串的最长公共子序列的长度

4.状态转移方程:如果t1[i - 1] == t2[j - 1]则dp[i][j] = max(dp[i - 1][j - 1] + 1, dp[i - 1][j], dp[i][j - 1]);即表示若当前上一个位置的字符相等则其对应的状态存储的最长公共子序列加一(dp[i - 1][j - 1] + 1);如果t1[i - 1] != t2[j - 1]则dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]);

解题方法

1.获取字符串text1和text2的长度text1Len和text2Len,并创建为对应的char类型数组t1和t2;生成二维数组dp:vector<vector> dp(text1Len + 1, vector(text2Len + 1));
2.初始化dp数组的第0行与第0列为0;
3.编写返回给定三个数中最大值的函数
4.从第一行开始执行动态转移方程
5.返回dp[text1Len][text2Len]

复杂度

时间复杂度:

O ( N M ) O(NM) O(NM);其中 N N N为字符产text1的长度, M M M为字符串text2的长度

空间复杂度:

O ( N M ) O(NM) O(NM)

Code

class Solution {
public:/*** Find the longest common subsequence* @param text1 Given string* @param text2 Given string* @return int*/int longestCommonSubsequence(string text1, string text2) {int text1Len = text1.length();int text2Len = text2.length();char *t1 = new char[text1Len + 1];char *t2 = new char[text2Len + 1];strcpy(t1, text1.c_str());strcpy(t2, text2.c_str());//dp[i][j] represents the LCS of// text1[0-i-1](substring of length i)// and text2[0-j-1](substring of length j)vector<vector<int>> dp(text1Len + 1, vector<int>(text2Len + 1));for (int j = 0; j <= text2Len; ++j) {dp[0][j] = 0;}for (int i = 0; i <= text1Len; ++i) {dp[i][0] = 0;}for (int i = 1; i <= text1Len; ++i) {for (int j = 1; j <= text2Len; ++j) {if (t1[i - 1] == t2[j - 1]) {dp[i][j] = max3(dp[i - 1][j - 1] + 1, dp[i - 1][j], dp[i][j - 1]);} else {dp[i][j] = max3(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]);}}}return dp[text1Len][text2Len];}private:/***Find the largest of the three numbers* @param a Figure to be compared* @param b Figure to be compared* @param c Figure to be compared* @return int*/int max3(int a, int b, int c) {int maxVal = a;if (maxVal < b) {maxVal = b;}if (maxVal < c) {maxVal = c;}return maxVal;}
};

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

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

相关文章

代码随想录二刷 | 回溯 |组合总和

代码随想录二刷 &#xff5c; 回溯 &#xff5c;组合总和 题目描述解题思路代码实现 题目描述 39.组合总和 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复…

503.下一个更大元素II 42.接雨水

503.下一个更大元素II 42.接雨水 503.下一个更大元素II 力扣题目链接(opens new window) 给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序&…

Linux操作系统——理解文件系统

预备知识 到目前为止&#xff0c;我们所学习到的关于文件的操作&#xff0c;全部都是基于文件被打开&#xff0c;被访问&#xff0c;访问期间比较重要的有重定向&#xff0c;缓冲区&#xff0c;一切皆文件&#xff0c;当我们访问完毕的时候需要将文件关闭&#xff0c;关闭时那…

基于FPGA的矩阵键盘驱动

按键数量较多时&#xff0c;为了减少 I/O ⼝的占⽤&#xff0c;通常将按键排列成矩阵形式。在矩阵式键盘中&#xff0c;每条⽔平线和垂直线在交叉处不直接连通&#xff0c;⽽是通过一个按键连接。⼋根线就可以控制4*416个按键&#xff0c;⽐之直接将端⼝线⽤于键盘多出了⼀倍&a…

应用层—HTTP详解(抓包工具、报文格式、构造http等……)

文章目录 HTTP1. 抓包工具的使用1.1 配置信息1.2 观察数据 2. 分析 https 抓包结果3. HTTP请求详解3.1 认识 URL3.1.1 URL 基本格式3.1.2 查询字符串 (query string)3.1.3 关于 URL Encode 3.2 认识 http 方法3.2.1 [经典问题] Get 和 Post 主要的区别是什么&#xff1f;&#…

HubSpot整合小红书,MessageBox助力多系统融合

在当今数字化潮流中&#xff0c;HubSpot与小红书的强大联盟成为了数字化市场的亮点。今天运营坛将深入解析它们的合作策略&#xff0c;聚焦于MessageBox在整合中的关键角色&#xff0c;以及它在推动HubSpot和小红书整合方面的关键作用。 HubSpot与小红书&#xff1a;数字化市场…

数据库设计和数据库对象

目录 序言 一、数据库设计的步骤 二、如何绘制E-R图 2.1 酒店管理系统的基本功能 2.2 绘制E-R 实体关系图&#xff08;三要素&#xff09;&#xff1a; 2.3 关系型数据库常见映射基数&#xff1a; 2.4 转化E-R图形成数据库模型图 三、使用三大范式实现数据库设计规范化…

本地部署轻量级web开发框架Flask并实现无公网ip远程访问开发界面

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架&#xff0c;采用Python编程语…

C++入门学习(七)整型

整型就是整数类型的数据&#xff08;-1&#xff0c;0&#xff0c;1等等&#xff09; 数据类型占用空间取值范围short(短整型)2字节 (-2^15 ~ 2^15-1) 32768~32767 int(整型)4字节(-2^31 ~ 2^31-1)long(长整形) Windows为4字节, Linux为4字节(32位), 8字节(64位) (-2^31 ~ 2^31…

flink部署模式介绍

在一些应用场景中&#xff0c;对于集群资源分配和占用的方式&#xff0c;可能会有特定的需求。Flink 为各种场景提供了不同的部署模式&#xff0c;主要有以下三种&#xff0c;它们的区别主要在于&#xff1a; 集群的生命周期以及资源的分配方式&#xff1b;应用的 main 方法到…

jmeter生成html性能结果报告

从3.0版本开始&#xff0c;jmeter引入了Dashboard Report模块&#xff0c;用于生成HTML类型的可视化图形报告。 1.生成html报告 1.1操作步骤&#xff1a; 进入JMeter的bin目录下&#xff1b;打开命令行窗口&#xff0c;输入以下命令&#xff1a; 对于Windows系统&#xff1a;…

open3d点云平移

功能简介 open3d中点云的平移函数为&#xff1a;pcd.translate((tx, ty, tz), relativeTrue)。当relative为True时&#xff0c;&#xff08;tx, ty, tz&#xff09;表示点云平移的相对尺度&#xff0c;也就是平移了多少距离。当relative为False时&#xff0c;&#xff08;tx, …