当前位置: 首页 > news >正文

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

Problem: 1143. 最长公共子序列

文章目录

  • 题目描述
  • 思路
  • 复杂度
  • Code

题目描述

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

思路

我们统一标记:str1[i]代表text1表示的字符数组,str2[j]代表text2表示的字符数组;LCS代表最长的公共子序列;(我们易得只有str1[i]和str2[j]均在LCS中时才能说明str1[i]和str2[j]是LCS的一部分

1.状态定义:dp[i][j]代表str1[1~i]和str2[1 ~ j]的最长公共子序列(我们暂时认为索引是从 1 开始的,例如:d[2][4] 的含义就是:对于 “ac” 和 “babc” ,它们的LCS ⻓度是 2)
image.png
2.状态转移:

2.1:初始状态初始化:我们初始化dp[0][j] = 0; dp[i][0] = 0,逻辑上说明,当str1或者str2其中为空时则LCS为0;
2.2:状态转移:若*str1[i] == str2[j]dp[i][j] = dp[i - 1][j - 1] + 1;若str1[i] != str2[j]*则dp[i][j] == max(dp[i-1][j],dp[i][j-1])

补充:

当*str1[i] != str2[j]*实则有三种状态:str1[i] != LCS[i];str2[j] != LCS[j]; str1[i] != str2[i] != LCS[i];但是我们在状态转移方程中dp[i][j] == max(dp[i-1][j],dp[i][j-1]);
实际上dp[i][j] == max(dp[i-1][j],dp[i][j-1],dp[i - 1][j - 1]),但是回看dp[i][j]的定义我们易知dp[i - 1][j - 1]是一定小于dp[i-1][j]和dp[i][j-1],所以我们则直接求取**max(dp[i-1][j],dp[i][j-1])**即可

复杂度

时间复杂度:

O ( M × N ) O(M \times N) O(M×N);其中 M M M为text1的长度, N N N为text2的长度

空间复杂度:

O ( M × N ) O(M \times N) O(M×N)

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 len1 = text1.length();int len2 = text2.length();//DP arrayvector<vector<int>> dp(len1 + 1, vector<int>(len2 + 1));//for (int i = 1; i < len1 + 1; ++i) {for (int j = 1; j < len2 + 1; ++j) {if (text1.at(i - 1) == text2.at(j - 1)) {dp[i][j] = 1 + dp[i - 1][j - 1];} else {dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}}}return dp[len1][len2];}
};
http://www.lryc.cn/news/306676.html

相关文章:

  • 如何使用群晖NAS中FTP服务开启与使用固定地址远程上传下载本地文件?
  • C语言文件知识点
  • C语言:数组指针 函数指针
  • 全面介绍HTML的语法!轻松写出网页
  • 数学建模【相关性模型】
  • 「优选算法刷题」:字母异位词分组
  • 【教程】 iOS混淆加固原理篇
  • 《银幕上的编码传奇:计算机科学与科技精神的光影盛宴》
  • linux提权之sudo风暴
  • 数据结构之:跳表
  • matlab 线性四分之一车体模型
  • LeetCode第二题: 两数相加
  • web组态插件
  • Android14 InputManager-InputManagerService环境的构造
  • 搜维尔科技:【周刊】适用于虚拟现实VR中的OptiTrack
  • matlab倒立摆小车LQR控制动画
  • 【C++】类和对象(2)
  • 用Python实现创建十二星座数据分析图表
  • 备战蓝桥杯————递归反转单链表的一部分
  • rabbitmq知识梳理
  • 【数据结构与算法】动态规划法解题20240227
  • 备战蓝桥杯—— 双指针技巧巧答链表2
  • 半监督节点分类-graph learning
  • 软件文档-运维-开发-管理-资质-评审-招投标-验收
  • 猫头虎分享已解决Bug || Vue中的TypeError: Cannot read property ‘name‘ of undefined 错误
  • 技术应用:使用Spring Boot、MyBatis Plus和Dynamic DataSource实现多数据源
  • C# Onnx 使用onnxruntime部署实时视频帧插值
  • 编程笔记 Golang基础 016 数据类型:数字类型
  • 一周学会Django5 Python Web开发-会话管理(CookiesSession)
  • QT之QString.arg输出固定位数