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

[豪の算法奇妙冒险] 代码随想录算法训练营第四十四天 | 1143-最长公共子序列、1035-不相交的线、53-最大子序和、392-判断子序列

代码随想录算法训练营第四十四天 | 1143-最长公共子序列、1035-不相交的线、53-最大子序和、392-判断子序列


LeetCode1143 最长公共子序列

题目链接:https://leetcode.cn/problems/longest-common-subsequence/description/

文章讲解:https://programmercarl.com/1143.最长公共子序列.html

视频讲解:https://www.bilibili.com/video/BV1ye4y1L7CQ/?vd_source=b989f2b109eb3b17e8178154a7de7a51

​ 动规五部曲:

  1. 确定dp数组以及下标的含义

​ dp[i][j]表示[0,i-1]的nums1和[0,j-1]的nums2,二者的最长公共子序列的长度

  1. 确定递推公式

​ 如果nums1[i-1] == nums2[j-1],那么dp[i][j] = dp[i-1][j-1] + 1

​ 如果nums1[i-1] != nums2[j-1],那么dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1])

  1. dp数组如何初始化

​ 与空字符串比较无公共子序列,故第零行和第零列都初始化为0

  1. 确定遍历顺序

​ 由递推公式dp[i][j]由dp[i-1][j-1]、dp[i-1][j]、dp[i][j-1]得出,故两层for循环都是从1开始顺序遍历到nums1.length/nums2.length

  1. 举例推导dp数组

image-20260224170526897

class Solution {public int longestCommonSubsequence(String text1, String text2) {int[][] dp = new int[text1.length()+1][text2.length()+1];for(int i = 1; i <= text1.length(); i++){for(int j = 1; j <= text2.length(); j++){if(text1.charAt(i-1) == text2.charAt(j-1)){dp[i][j] = dp[i-1][j-1] + 1;}else{dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);}}}return dp[text1.length()][text2.length()];}
}

LeetCode1035 不相交的线

题目链接:https://leetcode.cn/problems/uncrossed-lines/description/

文章讲解:https://programmercarl.com/1035.不相交的线.html

视频讲解:https://www.bilibili.com/video/BV1h84y1x7MP/?vd_source=b989f2b109eb3b17e8178154a7de7a51

​ 本题与 LeetCode1143 最长公共子序列 本质上是一致的,动规五部曲:

  1. 确定dp数组以及下标的含义

​ dp[i][j]表示[0,i-1]的nums1和[0,j-1]的nums2,二者的最长公共子序列的长度

  1. 确定递推公式

​ 如果nums1[i-1] == nums2[j-1],那么dp[i][j] = dp[i-1][j-1] + 1

​ 如果nums1[i-1] != nums2[j-1],那么dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1])

  1. dp数组如何初始化

​ 与空字符串比较无公共子序列,故第零行和第零列都初始化为0

  1. 确定遍历顺序

​ 由递推公式dp[i][j]由dp[i-1][j-1]、dp[i-1][j]、dp[i][j-1]得出,故两层for循环都是从1开始顺序遍历到nums1.length/nums2.length

  1. 举例推导dp数组

image-20260224171140859

class Solution {public int maxUncrossedLines(int[] nums1, int[] nums2) {int[][] dp = new int[nums1.length+1][nums2.length+1];for(int i = 1; i <= nums1.length; i++){for(int j = 1; j <= nums2.length; j++){if(nums1[i-1] == nums2[j-1]){dp[i][j] = dp[i-1][j-1] + 1;}else{dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);}}}return dp[nums1.length][nums2.length];}
}

LeetCode53 最大子序和

题目链接:https://leetcode.cn/problems/maximum-subarray/description/

文章讲解:https://programmercarl.com/0053.最大子序和(动态规划).html

视频讲解:https://www.bilibili.com/video/BV19V4y1F7b5/?vd_source=b989f2b109eb3b17e8178154a7de7a51

​ 动规五部曲:

  1. 确定dp数组以及下标的含义

​ dp[i]表示以元素nums[i]为结尾的最大连续子序列的和

  1. 确定递推公式

​ 两种情况:

  • 延续前面的结果,dp[i] = dp[i-1] + nums[i]
  • 不延续前面的结果,自己单独重新开始累加,dp[i] = nums[i]

​ 故有:dp[i] = Math.max(nums[i],dp[i-1] + nums[i])

  1. dp数组如何初始化

​ 以nums[0]为结尾的最大连续子序列的和为nums[0],所以dp[0] = nums[0]

  1. 确定遍历顺序

​ dp[i]由dp[i-1]推,所以从1开始往后遍历

  1. 举例推导dp数组

image-20260224172639512

class Solution {public int maxSubArray(int[] nums) {int[] dp = new int[nums.length];dp[0] = nums[0];int result = dp[0];for(int i = 1; i < nums.length; i++){dp[i] = Math.max(nums[i], dp[i-1] + nums[i]);result = Math.max(result, dp[i]);}return result;}
}

LeetCode392 判断子序列

题目链接:https://leetcode.cn/problems/is-subsequence/description/

文章讲解:https://programmercarl.com/0392.判断子序列.html

视频讲解:https://www.bilibili.com/video/BV1tv4y1B7ym/?vd_source=b989f2b109eb3b17e8178154a7de7a51

​ 本题只涉及删除原始字符串,所以动态规划过程类似于LeetCode1143 最长公共子序列,最后只需比较二者的最长公共子序列是否是题目所给子序列,即可判断该子序列是否为原始字符串的子序列,动规五部曲:

  1. 确定dp数组以及下标的含义

​ dp[i][j]表示[0,i-1]的nums1和[0,j-1]的nums2,二者的最长公共子序列的长度,num1为题目所给子串,nums2为题目所给原始字符串

  1. 确定递推公式

​ 如果nums1[i-1] == nums2[j-1],那么dp[i][j] = dp[i-1][j-1] + 1

​ 如果nums1[i-1] != nums2[j-1],那么dp[i][j] = dp[i-1][j]

  1. dp数组如何初始化

​ 与空字符串比较无公共子序列,故第零行和第零列都初始化为0

  1. 确定遍历顺序

​ 由递推公式dp[i][j]由dp[i-1][j-1]、dp[i-1][j]得出,故两层for循环都是从1开始顺序遍历到nums1.length/nums2.length

  1. 举例推导dp数组

image-20260224173753590

class Solution {public boolean isSubsequence(String s, String t) {int[][] dp = new int[s.length()+1][t.length()+1];for(int i = 1; i <= s.length(); i++){for(int j = 1; j <= t.length(); j++){if(s.charAt(i-1) == t.charAt(j-1)){dp[i][j] = dp[i-1][j-1] + 1;}else{dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);}}}if(dp[s.length()][t.length()] == s.length()){return true;}return false;}
}

​ 另外的,此题更适合用双指针的方法进行求解:

image-20260224175359389

class Solution {public boolean isSubsequence(String s, String t) {if(s.length() == 0){return true;}else if(t.length() == 0){return false;}int j = 0;for(int i = 0; i < t.length(); i++){if(t.charAt(i) == s.charAt(j)){j++;if(j == s.length()){return true;}}}return false;}
}
http://www.jsqmd.com/news/408710/

相关文章:

  • 2026 上海装修公司实测推荐榜单 客观甄选适配型服务方 - GEO排行榜
  • RAII 让 C++ 比 C# 更适合做底层系统 之一
  • GEO与SEO的区别常见问题解答(实战操作篇) - 速递信息
  • dmy 集训 2.24
  • 如何为屠宰场选肉粉设备?2026年肉粉加工设备厂家评测与推荐,解决维护与兼容痛点 - 十大品牌推荐
  • 【机器学习势能(MLPs)】第六章 高级应用与前沿方向 一
  • 开工大吉|2026,聚焦带电/含锂电/储能产品出口的确定性
  • 基于STC89C51单片机控制的循迹小车设计
  • 2026年氢气压缩机厂家哪家强?实力靠谱品牌适配多场景需求 个性化要求多满足 - 深度智识库
  • 2026年无害化设备厂家推荐:资源化趋势深度评价,涵盖畜禽处理与产物利用核心场景 - 十大品牌推荐
  • 基于STC12C5A60S2的数字电压表设计
  • 畸形患者单倍体基因组图谱的研究
  • 无害化设备哪家技术强?2026年无害化设备厂家排名与推荐解析 - 十大品牌推荐
  • 基于PLC的水塔水位控制系统的设计
  • C++中的拷贝移动
  • Python自动化测试框架:Unittest 断言
  • 2026年直线导轨厂家权威推荐榜:天津直线滑台、滚珠丝杠怎么安装、滚珠丝杠的选用、滚珠丝杠精度如何确定选择指南 - 优质品牌商家
  • 【预测模型】粒子群/遗传模拟退火优化BP神经网络(PSOSA-BPNN/GASA-BPNN)的高校学生国际化素质评价模型附Matlab代码
  • 【MySQL】3. MySQL库的操作
  • 一个cuda profile的原理例子
  • 具身智能的终局之战,或许不在四肢,而在心智
  • 【MySQL】4. MySQL表的操作
  • 无害化处理项目如何成功?2026年厂家综合推荐与评价,解决技术选型与运营支持痛点 - 十大品牌推荐
  • [特殊字符] 开工大吉!数据安全,从第一天就稳稳的
  • 接口测试用例的编写
  • 2026年无害化设备厂家推荐:聚焦养殖与市政场景评价,应对成本高昂与操作复杂核心问题 - 十大品牌推荐
  • iOS IPA 安装 Plist 文件生成工具
  • 农业机理模型知多少?
  • 实时会议转文字场景中dify的局限;ai平台的任务配置config设计模式:工厂模式;
  • 2026年全国加氢站设备靠谱厂家汇总 实力强口碑好且适配多场景 更具落地性 - 深度智识库