【动态规划】子数组、子串系列II|等差数列划分|最长湍流子数组|单词拆分|环绕字符串中唯一的子字符串

一、等差数列划分

413. 等差数列划分

280d78292156484f826d5b3cd72ab4f1.png

算法原理

6985193ba7724a0fbbb4ec5dc4d1f497.png

💡细节:

1.如果当前nums数组中i位置的数和前面两个数可以构成等差数列,那么当前位置所有子数组构成的等差数列个数dp[i]就等于前一个位置有子数组构成的等差数列个数+1(这个1代表增加最后三个数构成的等差数列)【简单理解:就是以a和b结尾的这些等差数列后面都加上一个c,这些新的等差数列也还是等差数列,加上a,b,c这个等差数列就是dp[i] = dp[i-1]+1】

两种情况最后三个数a,b,c根本无法构成等差数列,那么dp[i]=0

2.初始化:因为等差数列至少是三个数,那么dp[0] 和dp[1]根本无法构成等差数列,只能为0

3.根据dp表示可知,结果应该是dp表每个位置的和

class Solution {public int numberOfArithmeticSlices(int[] nums) {int n = nums.length;int[] dp = new int[n];//dp[i]表示:以i位置为结尾的所有子数组中有多少个等差数列int sum = 0;for(int i=2;i<n;i++) {dp[i] = nums[i]-nums[i-1]==nums[i-1]-nums[i-2]?dp[i-1]+1:0;sum += dp[i];}return sum;}
}

二、最长湍流子数组

978. 最长湍流子数组

dd48285fc90f493eafe0b60494b6a667.png

算法原理:

404c9de6e6a4425cba267dd5a7e9caf9.png

💡细节:

1.dp表的创建:如果只用一个dp表的话发现无法知道最后位置是上升还是下降,那么就考虑用两个dp表,一个表示子数组上升的最大长度,一个表示子数组下降的最大长度

2.初始化:根据状态转移方程,填表最差的情况都为1,那么直接全部初始化为1,那么有些填表的情况就不需要考虑了

3.返回值:两个表的最大值

💡总结:初始化的三种情况

(1)直接初始化会越界的位置

(2)加虚拟节点(但是有两个注意事项)=>初始化更简单

(3)把表中所有的位置都初始化为最小的情况(跟本题一样)

class Solution {public int maxTurbulenceSize(int[] nums) {int n = nums.length;int[] f = new int[n];//上升int[] g = new int[n];//下降for(int i=0;i<n;i++) {f[i] = g[i] = 1;}int ret = 1;for(int i=1;i<n;i++) {if(nums[i-1]<nums[i])f[i] = g[i-1] + 1;else if(nums[i-1]>nums[i])g[i] = f[i-1] + 1;ret = Math.max(ret,Math.max(g[i],f[i]));}return ret;}
}

三、单词拆分

139. 单词拆分

0b3ec6134f824b67939fa35d1c27d61d.png

 算法原理:

0468d5c70c22421482a989ba2638b0be.png

💡细节:

1.dp[i]:[0,i]区间内字符串是否可以被字典中的单词拼接而成,求状态转移方程时,需要设置最后一个单词的起始位置下标j,才能将dp进行联系,而且需要保证最后一个单词[j,i]在字典中&&上一个单词的位置dp[j-1]也为true

2.初始化:为了防止出现dp[j-1]中j-1为-1的情况,可以直接在s字符串前加一个字符,这样可以更好的处理下标的映射关系

3.优化1:找[j,i+1)的子串时,可以直接将字典中的单词存到哈希表中,在哈希表中去看子串是否存在

4.优化2:break =>只要在哈希表中找到一个单词即可,找到了就不用继续找下一个了

class Solution {public boolean wordBreak(String s, List<String> wordDict) {//优化1:将字典里面的单词存到哈希表中,在哈希表中找子串是否存在Set<String> hash = new HashSet<>(wordDict);int n = s.length();boolean[] dp = new boolean[n+1];//dp[i]:0-i区间内的字符串能否被拼接成功//初始化dp[0] = true;s = " " + s;//处理下标的映射关系(s的起始位置是从1开始的)for(int i=1;i<=n;i++) {for(int j=i;j>=1;j--) {if(dp[j-1]==true && hash.contains(s.substring(j,i+1))) {//左闭右开dp[i] = true;    break;//优化2:只要在哈希表中找到一个单词即可,找到了就不用继续找下一个了    }}}return dp[n];}
}

四、环绕字符串中唯一的子字符串

467. 环绕字符串中唯一的子字符串

7bd8300bce11407e94ba3fb30837d799.png

算法原理:

1011bf7d55294216af85970a59f59666.png

💡细节:

1.一般涉及子串的都会向长度为1,和长度大于1考虑状态转移方程

2.加一个连续字符的子串和未加这个字符的子串,当长度>1的时候,是一样大的,即dp[i]=dp[i-1]

3.初始化的技巧:直接初始化为最小值1,这样有些填表的情况就不需要考虑了

4.当个末尾字符相同的子串需要进行去重,创建一个大小为26的hash数组,把每个位置都填上以改字符结尾的最大dp值

class Solution {public int findSubstringInWraproundString(String ss) {int n = ss.length();char[] s = ss.toCharArray();//转为数组好用下标int[] dp = new int[n];//dp[i]:以i位置为结尾的所有子串里面,有多少个在base中出现过for(int i=0;i<n;i++) dp[i] = 1;//全部初始化为最小值for(int i=1;i<n;i++) {if(s[i-1]+1==s[i]||(s[i-1]=='z'&&s[i]=='a')) dp[i]+=dp[i-1];}//去重int[] hash = new int[26];for(int i=0;i<n;i++) {hash[s[i]-'a'] = Math.max(dp[i],hash[s[i]-'a']);}int sum = 0;for(int x:hash) sum+=x;return sum;}
}

 

 

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

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

相关文章

Maven 插件使用

1.spring-boot-maven-plugin 我们直接使用 maven package &#xff08;maven自带的package打包功能&#xff09;&#xff0c;打包Jar包的时候&#xff0c;不会将该项目所依赖的Jar包一起打进去&#xff0c;在使用java -jar命令启动项目时会报错&#xff0c;项目无法正常启动。…

【第17章】spring-mvc之日志和拦截器

文章目录 前言一、整合log4j1. 引入库2. log4j2.xml 二、拦截器1.拦截器类2.注册拦截器 三、过滤器和拦截器顺序总结 前言 【第2章】整合log4j2框架 在前面的spring中已经完成了对日志框架log4j的整合&#xff0c;这里我们直接拿过来用就行。 场景描述&#xff1a;每个接口请…

【iOS】frame与bounds区别

文章目录 前言framebounds两者区别size的区别总结 前言 在学习响应者链的过程中用到了frame与bounds的混用&#xff0c;这两个属性经常出现在我们的开发中&#xff0c;特别撰写一篇博客分析区别 首先&#xff0c;我们来看一下iOS特有的坐标系&#xff0c;在iOS坐标系中以左上…

LLM 可以从简单数据中学习吗?

在 10 月份的一次周会结束后&#xff0c;我提到 SFT 训练后的 Loss 曲线呈现阶梯状&#xff0c;至于为什么&#xff0c;并没有人有合理的解释&#xff0c;加上当时的重心是提升次日留存率&#xff0c;Loss 曲线呈现阶梯状与次日留存率的关系还太远&#xff0c;即使有问题&#…

Java练手项目 个人学习等选题参考

难度系数说明&#xff1a; 难度系数用来说明项目本身进行分析设计的难度 难度系数大于1的项目是非常值得反复学习的&#xff0c;从项目中成长 前言 大家好&#xff0c;我是二哈喇子&#xff0c;此博文整理了各种项目需求 要从本篇文章下的项目中学习的思路&#xff1a; 用的…

基于STM32F401RET6智能锁项目(使用库函数点灯、按键)

点灯硬件原理图 1、首先&#xff0c;我们查看一下原理图&#xff0c;找到相对应的GPIO口 LED_R低电平导通&#xff0c;LED4亮&#xff0c;所以LED_R的GPIO口需要配置一个低电平才能亮&#xff1b; LED_G低电平导通&#xff0c;LED3亮&#xff0c;所以LED_R的GPIO口需要配置一…

防爆气象仪

TH-WFB5矿山作为一个特殊的工作环境&#xff0c;其安全生产一直是重中之重。而矿山环境中的气象变化&#xff0c;如温度、湿度、风速、风向等&#xff0c;不仅直接影响矿山的日常生产活动&#xff0c;还关系到矿工的生命安全。因此&#xff0c;防爆气象仪的应用显得尤为重要。 …

陪玩系统APP小程序H5音视频社交系统陪玩系统源码,陪玩app源码,陪玩源码搭建陪玩社交系统开发(现成,可定制)线下陪玩系统项目开发搭建

线下陪玩系统项目的设计 在需求分析完成后&#xff0c;接下来进行系统设计。系统设计主要包括以下几个部分&#xff1a; 1. 数据库设计&#xff1a;根据需求分析的结果&#xff0c;设计数据库结构&#xff0c;包括用户信息表、服务信息表、订单信息表等。 2. 界面设计&#…

激光雷达:盲人世界的导航灯塔

在科技日新月异的今天&#xff0c;一项名为“蝙蝠避障”的创新成果&#xff0c;正悄然改变着盲人朋友的日常生活&#xff0c;特别是在出行这一领域&#xff0c;它的应用如同一束光&#xff0c;照亮了前行的道路。本文将深入探讨激光雷达技术对盲人的帮助&#xff0c;揭示这项高…

虚拟化技术 分离虚拟机数据流量与ESXi的流量管理

一、实验内容 为ESXi主机添加网卡通过vClient查看已添加的网卡信息为ESXi添加网络&#xff0c;创建标准交换机修改网络配置&#xff0c;实现虚拟机数据流量与ESXi的管理流量分离 二、实验主要仪器设备及材料 安装有64位Windows操作系统的台式电脑或笔记本电脑&#xff0c;建…

探索震坤行API:一键解锁高效工业用品采购新纪元!

震坤行是一家专注于工业用品的B2B电商平台&#xff0c;为企业客户提供一站式的工业用品采购服务。虽然震坤行没有直接公开通用的API接口供开发者调用&#xff0c;但通常大型企业或合作伙伴之间可以通过API进行系统集成和数据交互。以下是一个假设性的震坤行API接口调用示例与代…

如何使用 ERNIE 千帆大模型基于 Flask 搭建智能英语能力评测对话网页机器人(详细教程)

ERNIE 千帆大模型 ERNIE-3.5是一款基于深度学习技术构建的高效语言模型&#xff0c;其强大的综合能力使其在中文应用方面表现出色。相较于其他模型&#xff0c;如微软的ChatGPT&#xff0c;ERNIE-3.5不仅综合能力更强&#xff0c;而且在训练与推理效率上也更高。这使得ERNIE-3…