力扣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.rhkb.cn/news/244011.html

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

相关文章

微信小程序如何获取当前日期时间

Hello大家好&#xff01;我是咕噜铁蛋&#xff0c;获取当前日期时间是小程序中经常会用到的一个功能。因此&#xff0c;在本文中&#xff0c;我通过科技手段给大家收集整理了下&#xff0c;今天我将向大家介绍如何在微信小程序中获取当前日期时间的方法&#xff0c;并分享一些实…

【Unity】URP报错Object reference not set to an instance of an object

使用URP之后&#xff0c;Unity报错&#xff1a;显示不正常 NullReferenceException: Object reference not set to an instance of an object UnityEngine.Rendering.Universal.UniversalAdditionalCameraData.get_cameraStack () (at Library/PackageCache/com.unity.render-p…

VSCode 插件推荐

前言 关于开发用的插件就不做赘述了&#xff0c;网上面有很多文章都做了推荐&#xff0c;本文推荐几个好看的插件。 文件图标主题 Vscode icons Material Icon Theme 字体主题 推荐 One Dark Pro 其他 推荐一个生成好看代码的网址 https://carbon.now.sh/

Unity 抽象工厂模式(实例详解)

文章目录 简介实例1实例2 简介 抽象工厂模式是一种创建型设计模式&#xff0c;它提供了一种方式来封装一组相关或相互依赖对象的创建过程&#xff0c;而无需指定具体类。这种模式常用于系统中有多组相关产品族&#xff0c;且客户端需要使用不同产品族中的对象时。 在Unity中&a…

第一篇【传奇开心果系列】beeware的toga开发移动应用:轮盘抽奖移动应用

系列博文目录 beeware的toga开发移动应用示例系列博文目录一、项目目标二、开发传奇开心果轮盘抽奖安卓应用编程思路三、传奇开心果轮盘抽奖安卓应用示例代码四、补充抽奖逻辑实现五、开发传奇开心果轮盘抽奖苹果手机应用编程思路六、开发传奇开心果轮盘抽奖苹果手机应用示例代…

C#,最小生成树(MST)克鲁斯卡尔(Kruskal)算法的源代码

一、Kruskal算法简史 克鲁斯卡尔&#xff08;Kruskal&#xff09;算法是一种用来寻找最小生成树的算法&#xff0c;由Joseph Kruskal在1956年发表。用来解决同样问题的还有Prim算法和Boruvka算法等。三种算法都是贪婪算法的应用。和Boruvka算法不同的地方是&#xff0c;Kruska…

C++大学教程(第九版)6.38汉诺塔问题

文章目录 题目代码运行截图 题目 (汉诺塔问题)在这一章中大家了解了既可以用递归方法又可以用迭代方法很容易实现的函数。不过&#xff0c;在这道练习题中&#xff0c;我们提出的问题若用递归来解决&#xff0c;则尽显递归之优雅:若用迭代来实现&#xff0c;恐怕没那么容易。 …

深入Docker5:安装nginx部署完整项目

目录 准备 为什么要使用nginx mysql容器构建 1.删除容器 2.创建文件夹 3.上传配置文件 4.命令构建mysql容器 5.进入mysql容器&#xff0c;授予root所有权限 6.在mysql中用命令运行sql文件 7.创建指定数据库shop 8.执行指定的sql文件 nginx安装与部署 1.拉取镜像 2…

xxe漏洞之scms靶场漏洞

xxe-scms 代码审核 &#xff08;1&#xff09;全局搜索simplexml_load_string simplexml_load_string--将XML字符串解释为对象 &#xff08;2&#xff09;查看源代码 ID1 $GLOBALS[HTTP_RAW_POST_DATA]就相当于file_get_contents("php://input"); 因此这里就存…

性能优化-OpenCL运行时API介绍

「发表于知乎专栏《移动端算法优化》」 本文首先给出 OpenCL 运行时 API 的整体编程流程图&#xff0c;然后针对每一步介绍使用的运行时 API&#xff0c;讲解 API 参数&#xff0c;并给出编程运行实例。总结运行时 API 使用的注意事项。最后展示基于 OpenCL 的图像转置代码。在…

惬意上手Python —— 装饰器和内置函数

1. Python装饰器 Python中的装饰器是一种特殊类型的函数&#xff0c;它允许用户在不修改原函数代码的情况下&#xff0c;增加或修改函数的行为。 具体来说,装饰器的工作原理基于Python的函数也是对象这一事实&#xff0c;可以被赋值给变量、作为参数传递给其他函数或者作为其他…

Spring Cloud可视化智慧工地大数据云平台源码(人、机、料、法、环五大维度)

智慧工地平台是依托物联网、互联网、AI、可视化建立的大数据管理平台&#xff0c;是一种全新的管理模式&#xff0c;能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三…

JUC并发编程-集合不安全情况以及Callable线程创建方式

6. 集合不安全 1&#xff09;List 不安全 //java.util.ConcurrentModificationException 并发修改异常&#xff01; public class ListTest {public static void main(String[] args) {List<Object> arrayList new ArrayList<>();for(int i1;i<30;i){new Thr…

“疫”后不emo,直播电商点亮鞋服赛道新生机

“ 走出阴霾&#xff0c;把握机遇 ” 文&#xff5c;王娴 编辑 | 靳淇 出品&#xff5c;极新 2023年&#xff0c;零售消费呈现缓慢复苏趋势&#xff0c;而直播电商也越发成为消费行业的重要增长引擎。对鞋服行业而言&#xff0c;直播电商独特的内容生态在传递时尚理念、激…

【GitHub项目推荐--微软开源的可视化工具】【转载】

说到数据可视化&#xff0c;大家都很熟悉了&#xff0c;设计师、数据分析师、数据科学家等&#xff0c;都需要用各种方式各种途径做着数据可视化的工作.....当然许多程序员在工作中有时也需要用到一些数据可视化工具&#xff0c;如果工具用得好&#xff0c;就可以把原本枯燥凌乱…

3d gaussian splatting笔记(paper部分翻译)

本文为3DGS paper的部分翻译。 基于点的&#x1d6fc;混合和 NeRF 风格的体积渲染本质上共享相同的图像形成模型。 具体来说&#xff0c;颜色 &#x1d436; 由沿射线的体积渲染给出&#xff1a; 其中密度 &#x1d70e;、透射率 &#x1d447; 和颜色 c 的样本是沿着射线以…

【数据结构】二叉树算法讲解(定义+算法原理+源码)

博主介绍&#xff1a;✌全网粉丝喜爱、前后端领域优质创作者、本质互联网精神、坚持优质作品共享、掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战✌有需要可以联系作者我哦&#xff01; &#x1f345;附上相关C语言版源码讲解&#x1f345; &#x1f44…

暴力破解常见的服务器

目录 使用 pydictor 生成自己的字典工具liunx下载使用常用的参数说明插件型字典 (可自己根据 API 文档开发) 使用 hydra 工具在线破解系统用户密码使用 hydra 破解 windows 7 远程桌面密码使用 hydra 工具破解 ssh 服务 root 用户密码 使用 Medusa 工具在线破解medusa参数说明M…

NetSuite 文心一言(Ernie)的AI应用

有个故事&#xff0c;松下幸之助小时候所处的年代是明治维新之后&#xff0c;大量引用西洋技术的时期。当时大家对“电”能干什么事&#xff0c;充满好奇。“电能干什么&#xff1f;它能帮我们开门么&#xff1f;” 松下幸之助的爷爷对电不屑&#xff0c;于是就问他。松下幸之助…

设计模式—行为型模式之观察者模式

设计模式—行为型模式之观察者模式 观察者模式(Observer Pattern)&#xff1a;定义对象间的一种一对多依赖关系&#xff0c;使得每当一个对象状态发生改变时&#xff0c;其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅&#xff08;Publish/Subscribe&#…