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

1143.最长公共子序列

在这里插入图片描述

题目链接:1143.最长公共子序列
文档讲解:代码随想录
状态:一开始没想明白为啥要 max(dp[i - 1][j], dp[i][j - 1])

思路:
如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;

如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。

即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

题解:

    // 二维动态规划方法public int longestCommonSubsequence(String text1, String text2) {char[] chars1 = text1.toCharArray();char[] chars2 = text2.toCharArray();int m = chars1.length;int n = chars2.length;// 创建二维dp数组,dp[i][j]表示text1前i个字符和text2前j个字符的最长公共子序列长度int[][] dp = new int[m + 1][n + 1];// 遍历每个字符,填充dp数组for (int i = 1; i <= chars1.length; i++) {for (int j = 1; j <= chars2.length; j++) {if (chars1[i - 1] == chars2[j - 1]) {// 如果字符相等,则当前状态等于左上角状态加1dp[i][j] = dp[i - 1][j - 1] + 1;} else {// 如果字符不相等,则当前状态等于上方和左方状态的最大值dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);}}}// 返回最终结果,dp[m][n]即为最长公共子序列长度return dp[m][n];}// 一维动态规划方法(空间优化)public int longestCommonSubsequence2(String text1, String text2) {char[] chars1 = text1.toCharArray();char[] chars2 = text2.toCharArray();int n = chars2.length;// 创建一维dp数组,dp[j]表示text1前i个字符和text2前j个字符的最长公共子序列长度int[] dp = new int[n + 1];// 遍历每个字符,填充dp数组for (int i = 1; i <= chars1.length; i++) {int pre = dp[0]; // 保存左上角的值for (int j = 1; j <= chars2.length; j++) {int cur = dp[j]; // 当前dp[j]的值,在更新dp[j]之前保存它if (chars1[i - 1] == chars2[j - 1]) {// 如果字符相等,则当前状态等于左上角状态加1dp[j] = pre + 1;} else {// 如果字符不相等,则当前状态等于上方和左方状态的最大值dp[j] = Math.max(dp[j], dp[j - 1]);}pre = cur; // 更新pre为当前dp[j]的值}}// 返回最终结果,dp[n]即为最长公共子序列长度return dp[n];}

1035.不相交的线

在这里插入图片描述

题目链接:1035.不相交的线
文档讲解:代码随想录
状态:还行

思路:
直线不能相交,这就是说明在字符串A中 找到一个与字符串B相同的子序列,且这个子序列不能改变相对顺序,只要相对顺序不改变,链接相同数字的直线就不会相交。
所以,本题说是求绘制的最大连线数,其实就是求两个字符串的最长公共子序列的长度!

题解:

class Solution {// 二维动态规划方法public int maxUncrossedLines(int[] nums1, int[] nums2) {int m = nums1.length;int n = nums2.length;// 创建二维dp数组,dp[i][j]表示nums1前i个元素和nums2前j个元素能形成的最大不相交的线数int[][] dp = new int[m + 1][n + 1];// 遍历每个元素,填充dp数组for (int i = 1; i <= nums1.length; i++) {for (int j = 1; j <= nums2.length; j++) {if (nums1[i - 1] == nums2[j - 1]) {// 如果元素相等,则当前状态等于左上角状态加1dp[i][j] = dp[i - 1][j - 1] + 1;} else {// 如果元素不相等,则当前状态等于上方和左方状态的最大值dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);}}}// 返回最终结果,dp[m][n]即为最大不相交的线数return dp[m][n];}// 一维动态规划方法(空间优化)public int maxUncrossedLines2(int[] nums1, int[] nums2) {int n = nums2.length;// 创建一维dp数组,dp[j]表示nums1前i个元素和nums2前j个元素能形成的最大不相交的线数int[] dp = new int[n + 1];// 遍历每个元素,填充dp数组for (int i = 1; i <= nums1.length; i++) {int pre = dp[0]; // 保存左上角的值for (int j = 1; j <= nums2.length; j++) {int cur = dp[j]; // 当前dp[j]的值,在更新dp[j]之前保存它if (nums1[i - 1] == nums2[j - 1]) {// 如果元素相等,则当前状态等于左上角状态加1dp[j] = pre + 1;} else {// 如果元素不相等,则当前状态等于上方和左方状态的最大值dp[j] = Math.max(dp[j], dp[j - 1]);}pre = cur; // 更新pre为当前dp[j]的值}}// 返回最终结果,dp[n]即为最大不相交的线数return dp[n];}
}

53. 最大子序和

在这里插入图片描述

题目链接:53. 最大子序和
文档讲解:代码随想录
状态:还行

思路:
dp[i]只有两个方向可以推出来:

dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和
nums[i],即:从头开始计算当前连续子序列和

题解:

   // 贪心算法:每次加上的数字如果不能使sum增加,那就从下个数字开始public int maxSubArray(int[] nums) {int max = nums[0]; // 初始化最大子数组和为数组的第一个元素int sum = 0; // 当前子数组和for (int num : nums) {sum += num; // 更新当前子数组和max = Math.max(max, sum); // 更新最大子数组和if (sum <= 0) {sum = 0; // 如果当前子数组和为负数或0,从下一个元素重新开始计算}}return max; // 返回最大子数组和}// 动态规划算法:dp[i]表示以第i个元素结尾的最大子数组和public int maxSubArray2(int[] nums) {int[] dp = new int[nums.length + 1]; // 创建dp数组,长度为nums.length+1dp[0] = nums[0]; // 初始化dp[0]为数组的第一个元素int max = nums[0]; // 初始化最大子数组和为数组的第一个元素for (int i = 1; i < nums.length; i++) {// dp[i]表示以第i个元素结尾的最大子数组和dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);// 更新最大子数组和max = Math.max(max, dp[i]);}return max; // 返回最大子数组和}

392.判断子序列

在这里插入图片描述

题目链接:392.判断子序列
文档讲解:代码随想录
状态:so easy

思路:
可以双指针,也可以动态规划。

题解:

    // 双指针方法判断s是否为t的子序列public boolean isSubsequence(String s, String t) {// 将字符串s和t转换为字符数组char[] sChars = s.toCharArray();char[] tChars = t.toCharArray();// 初始化两个指针,分别指向sChars和tChars的起始位置int j = 0;// 遍历tChars数组for (int i = 0; i < tChars.length && j < sChars.length; i++) {// 如果当前字符相等,则移动指向sChars的指针if (tChars[i] == sChars[j]) {j++;}}// 如果j等于sChars的长度,说明s是t的子序列return j == sChars.length;}public boolean isSubsequence2(String s, String t) {char[] chars1 = s.toCharArray();char[] chars2 = t.toCharArray();int n = chars2.length;// 创建一维dp数组,dp[j]表示text1前i个字符和text2前j个字符的最长公共子序列长度int[] dp = new int[n + 1];// 遍历每个字符,填充dp数组for (int i = 1; i <= chars1.length; i++) {int pre = dp[0]; // 保存左上角的值for (int j = 1; j <= chars2.length; j++) {int cur = dp[j]; // 当前dp[j]的值,在更新dp[j]之前保存它if (chars1[i - 1] == chars2[j - 1]) {// 如果字符相等,则当前状态等于左上角状态加1dp[j] = pre + 1;} else {// 如果字符不相等,则当前状态等于上方和左方状态的最大值dp[j] = Math.max(dp[j], dp[j - 1]);}pre = cur; // 更新pre为当前dp[j]的值}}// 返回最终结果,dp[n]即为最长公共子序列长度return dp[n] == chars1.length;}

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

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

相关文章

亚马逊个人卖家掌控物流,教你在单个ERP端口上实现全自动发货

亚马逊个人卖家可对接20多家国际物流&#xff0c;个人如何发货打单&#xff1f; 大家好&#xff0c;今天介绍这款erp有了订单后怎么发货。个人ERP在选择发货的时候只能选择中转仓&#xff0c;这是要把货发给ERP的商家&#xff0c;由商家代打包&#xff0c;打包费。这块开发了自…

协议转换网关的工作原理-天拓四方

在当今数字化和网络化的社会中&#xff0c;不同系统和设备之间的通信至关重要。然而&#xff0c;由于技术多样性、厂商差异以及应用需求的复杂性&#xff0c;不同的系统和设备常常采用不同的通信协议&#xff0c;这使得它们之间的直接通信变得困难。为了解决这一问题&#xff0…

新型过滤沉淀池设备优点

新型过滤沉淀池设备优点 磁混凝一体化设备优点&#xff1a; &#xff08;1&#xff09;磁混凝水头损失较少&#xff0c;本质上是混凝沉淀工艺&#xff0c;较过滤水头损失很少&#xff0c;而出水达到过滤的效果。磁混凝滤池低水位差约0.6m&#xff0c;主要体现在沉淀池出水槽跌水…

如何利用Java进行大数据处理?

如何利用Java进行大数据处理&#xff1f; 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 引言 在当今信息爆炸的时代&#xff0c;处理大数据是许多应用程序和系统的核心需求之一。Java作为一种…

单片机软件架构连载(5)-队列

前面讲了指针、结构体之类的基础知识。 这篇内容开始&#xff0c;就要对这些基础知识&#xff0c;做一些复杂的应用了&#xff0c;比如说队列。 其实&#xff0c;在2018年的时候&#xff0c;我录制过一套程序架构的视频&#xff0c;里面有手把手写队列的教程&#xff0c;讲了一…

中国计量大学理学院访问赛氪网:共探校企合作新篇章来

2024年7月5日&#xff0c;中国计量大学理学院代表团莅临环球赛乐&#xff08;北京&#xff09;科技有限公司&#xff0c;进行了一场深入的调研交流活动。代表团成员包括中国计量大学理学院副院长王义康教授、数据科学系副主任刘学艺副教授以及金世举老师。此次访问旨在进一步强…

暑期限定|get你的联邦学习技能,隐私计算暑期夏令营开启报名!

伴随着数字经济时代的来临&#xff0c;数据的安全流通和隐私保护也迎来了新的发展和挑战。隐私技术作为关键技术&#xff0c;可以在保护数据安全的同时&#xff0c;联合多方进行安全计算。 “隐语”是蚂蚁集团于2022年开源的一套可信隐私计算技术框架&#xff0c;支持了包括多…

复合机器人:手脚眼脑的完美结合

在现代工业制造的舞台上&#xff0c;复合机器人如同一位精密而高效的工匠&#xff0c;以其独特的手脚眼脑&#xff0c;正深刻改变着传统的生产方式。这些机器人不仅仅是机械臂的简单延伸&#xff0c;它们汇聚了先进的机械结构、智能的感知系统、精密的控制技术和灵活的思维能力…

js 数组合并方式

1. 使用 concat 方法 》不改变原数组 concat 方法可以将多个数组或值合并成一个新数组。 const arr1 [1, 2, 3] const arr2 [4, 5, 6] const mergedArr arr1.concat(arr2) // [1, 2, 3, 4, 5, 6]2. 使用展开运算符 (...) 》不改变原数组 展开运算符 ... 可以用于展开数组…

Web应用安全实用建议

引言 随着互联网的飞速发展&#xff0c;Web应用已成为企业与用户互动的重要桥梁。然而&#xff0c;Web应用面临着各种安全威胁&#xff0c;这些威胁不仅可能导致数据泄露&#xff0c;还会损害企业的声誉&#xff0c;甚至造成经济损失。为了确保Web应用的安全性&#xff0c;必须…

【虚拟机安装centos7.6 yum使用报错 配置镜像源 错误记录】

错误 [rootlocalhost ~]# yum -y update 已加载插件&#xff1a;fastestmirror Loading mirror speeds from cached hostfileOne of the configured repositories failed (未知),and yum doesnt have enough cached data to continue. At this point the onlysafe thing yum c…

「数据结构」和「数据类型两个概念的本质是什么区别与联系是什么

貌似数据结构中包含了数据类型&#xff0c;而数据类型又建立在数据结构之上&#xff1f; 就像有人在其他评论里说的&#xff0c;数据本质上是没有类型的。我们都知道&#xff0c;数据在存储上是一堆01的数字&#xff0c; 刚好我有一些资料&#xff0c;是我根据网友给的问题精心…

神卓互联共享文件使用教程

#文件共享# 文件共享已成为我们日常生活和工作中不可或缺的一部分。它如同一条无形的纽带&#xff0c;将人们紧密地联系在一起&#xff0c;促进了信息的快速传播和交流。 文件共享的魅力在于其打破了地域和时间的限制。无论我们身处世界的哪个角落&#xff0c;只要有网络连接&a…

【Scrapy】Scrapy 中间件等级设置规则

准我快乐地重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 再去做没流着情泪的伊人 假装再有从前演过的戏份 重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 你纵是未明白仍夜深一人 穿起你那无言毛衣当跟你接近 &#x1f3b5; 陈慧娴《傻女》 Scrapy 是…

收银系统源码-次卡功能

智慧新零售收银系统是一套线下线上一体化收银系统&#xff0c;给门店提供了含线下收银称重、线上商城、精细化会员管理、ERP进销存、营销活动、移动店务助手等一体化行业解决方案&#xff01; 详细功能见下文&#xff1a; 门店收银系统源码-CSDN博客文章浏览阅读2.6k次&#…

[Python爬虫] 抓取京东商品数据||京东商品API接口采集

本文结构&#xff1a; 一、引言 二、代码分享 三、问题总结 引言 这两天因为一些需求&#xff0c;研究了一下如何爬取京东商品数据。最开始还是常规地使用selenium库进行商品页的商品抓取&#xff0c;后来因为想要获取优惠信息&#xff0c;只能进入到商品详情页进行抓取&#x…

【5G VoNR】VoNR流程简述

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

重写equals()方法为什么同时要重写hashcode()

equals()方法 equals()方法是Object类中的一个方法&#xff0c;在Object类中&#xff0c;equals等同于。 在不同的类中&#xff0c;往往会对equals()按需求进行重写。重写的目的都是&#xff1a;用于比较两个对象是否 "相等"。如果两个对象的内容相同&#xff0c;那…

fiddler移动端抓包

步骤 1、手机和电脑必须在同一个局域网&#xff1a; 1&#xff09;手机和电脑连同一个WiFi&#xff1b; 2&#xff09;手机连WiFi&#xff0c;电脑用网线连接开启这个WiFi的无线路由&#xff1b; 3&#xff09;电脑开热点&#xff0c;手机连热点 2、开启fiddler代理&#xff…

faskapi好用的模板

在Web开发领域&#xff0c;FastAPI作为一个基于Python的高性能Web框架&#xff0c;因其快速、易用以及强大的功能而备受开发者青睐。关于FastAPI的好用模板&#xff0c;这里介绍几个不同角度的模板或项目框架&#xff0c;以帮助您更好地理解和选择适合自己的起点。 1. FastAPI…