代码随想录算法训练营第四十七天|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…

单片机软件架构连载(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;它们汇聚了先进的机械结构、智能的感知系统、精密的控制技术和灵活的思维能力…

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

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

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

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

收银系统源码-次卡功能

智慧新零售收银系统是一套线下线上一体化收银系统&#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技术研究。 博客内容主要围绕…

faskapi好用的模板

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

第十一节 动态面板加密解密显示

在原型中我们经常会遇到文件加密与解密显示问题&#xff0c;下面以一个简单案例来说明实现怎么切换明文与密文不同显示方式案例说明&#xff1b; 1、添加动态面板 2、设置加密与不加密 3、添加动作事项 注意为可见时要设置面板状态向前循环&#xff0c;上一项&#xff0c;否则…

新闻第一线|随身WiFi市场乱象与破局者:格行以品质重塑行业信任、随身WiFi行业标杆!

在快速发展的移动互联网时代&#xff0c;随身WiFi凭借用网方便性价比高也随之爆火。然而&#xff0c;近年来&#xff0c;随身WiFi市场却陷入了“内卷”与“信任危机”的双重困境&#xff0c;消费者在选择时往往面临质量问题。在此背景下&#xff0c;格行以其独特的品牌理念和扎…

Linux网络配置管理

目录 一、网络配置 1. 网卡配置 2. 路由 二、 网络信息查看 1.netstat 2. ss 三、 额外的命令 time 一、网络配置 之前我们学过 ifconfig &#xff0c;这个命令可以查看网络接口的地址配置信息&#xff0c;我们只知道它可以查看接口名称、IP 地址、子网掩码等。 但是&a…

MySQL 进阶(二)【索引详解】

前言 程序员避不开和数据库打交道&#xff0c;大数据更是如此&#xff0c;不管是 MySQL、Oracle、SQL Server 这些 OLTP 数据库&#xff0c;还是Greeplum、StarRocks、Hive、Spark SQL、Flink SQL、ClickHouse 等 OLAP 数据库&#xff0c;SQL 都是最基础最重要的能力&#xff0…

DFS回溯剪枝|KMP通过数组记录减少判断子字符串|思路

KMP|DFS回溯剪枝 #1、NC149kmp 初步思路&#xff1a; 两层for循环&#xff0c;一个T的字符开始与 S的字符比较&#xff0c;挨个比较&#xff0c;遇到不同就continue当前T的字符&#xff0c;重复步骤》效率太低&#xff0c;超时 eg: TABSABABABD SABABD S&#xff01;A时&#…

【目录】阅读须知!全博文、专栏大纲

首先要和大家说一下&#xff0c;博主的文章并不是想到哪里写到哪里&#xff0c;而是以整个大后端为主题&#xff0c;成体系的在写专栏&#xff0c;从和后端紧相关的计算机核心课程开始、到JAVA SE、JAVA EE、到数据库、MQ等各类中间件、再到业务场景、性能优化。当然也会涉及一…

【Go】常见的变量与常量

变量 常见的变量声明方式 一、声明单个变量的多种方式 1.声明一个变量初始化一个值 //声明变量 默认值是0&#xff0c;var a int//初始化一个值a 1fmt.Println(a) 2. 在初始化的时候省去数据类型&#xff0c;通过值自动匹配当前的变量的数据类型 var b 2fmt.Println(&quo…

html+css+js随机验证码

随机画入字符、线条 源代码在图片后面 点赞❤️关注&#x1f60d;收藏⭐️ 互粉必回 图示 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"…