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

动态规划-两个数组的dp问题——1143.最长公共子序列

1.题目解析

题目来源:1143.最长公共子序列——力扣

测试用例

2.算法原理

1.状态表示

由题目可知是两个dp表的动态规划问题,那么一维dp表显然无法满足状态表示,所以需要一个二维dp表,这里的dp[i][j]表示:s1字符数组[0,i]区间与s2字符数组[0,j]区间的最长公共子序列的长度

2.状态转移方程 

状态转移方程需要判断最后一个位置的字符是否相等来分类讨论,如下

3.初始化 

初始化需要用到空串并且需要注意对于下标映射的处理,如图

4.填表顺序

在填写dp[i][j]时可能用到dp[i-1][j]与dp[i][j-1]以及dp[i-1][j-1]位置的值,那么就需要从上到下,每一行从左到右来填表

5.返回值 

根据状态表示直接返回dp[m][n]即可

3.实战代码

代码解析 

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

 


http://www.mrgr.cn/news/64729.html

相关文章:

  • leetcode224:基本计算器
  • Redis常见面试题概览——针对实习面试
  • 解决缓存击穿的代码[最佳实践版]
  • 力扣刷题hot100题python实现
  • Freertos学习日志(1)-基础知识
  • Python小白学习教程从入门到入坑------第二十四课 继承(语法进阶)
  • Java 中的 堆栈(Stack)
  • 海滨学院班级记忆档案:设计与技术实现
  • 单例模式四种写法
  • C#/.NET/.NET Core学习路线集合,学习不迷路!
  • 使用贪心策略求解糖果罐调整次数
  • Foods
  • 三层交换实现不同VLAN之间设备的互通
  • js中多let与var
  • 【016C】基于51单片机电子秤(LCD1602显示)
  • SpringBoot框架下:构建专业在线试题库
  • 找不到msvcp120.dll,无法继续执行代码的五种解决方法一步一步指南
  • 数据结构与算法——Java实现 52.力扣98题——验证二叉搜索树
  • spring-boot(thymeleaf前端框架,简单了解)、( 跨域请求)
  • 【LwIP源码学习5】网口接收数据处理过程
  • 数据挖掘(七)
  • 【设计模式系列】总览
  • ‌【元素周期表】氢
  • LeetCode 3226. 使两个整数相等的位更改次数
  • 11.3笔记
  • 图解大模型训练系列:序列并行1,Megatron SP