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

一、等差数列划分

413. 等差数列划分

算法原理

💡细节:

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. 最长湍流子数组

算法原理:

💡细节:

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. 单词拆分

 算法原理:

💡细节:

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. 环绕字符串中唯一的子字符串

算法原理:

💡细节:

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

2.

3.初始化的技巧:直接初始化为最小值1

4.当个字符相同的子串需要进行去重,

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://xiahunao.cn/news/3030892.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Qt 学习笔记】Qt常用控件 | 多元素控件 | Table Widget的说明及介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 多元素控件 | Table Widget的说明及介绍 文章编号&#…

Java面试——MyBatis

优质博文&#xff1a;IT-BLOG-CN 一、MyBatis 与 JDBC 的区别 【1】JDBC 是 Java 提供操作数据库的 API&#xff1b;MyBatis 是一个持久层 ORM 框架&#xff0c;底层是对 JDBC 的封装。 【2】使用 JDBC 需要连接数据库&#xff0c;注册驱动和数据库信息工作量大&#xff0c;每…

【C++】CentOS环境搭建-快速升级G++版本

【C】CentOS环境搭建-快速升级G版本 1. 安装CentOS的软件集仓库&#xff1a;2. 安装你想要的devtoolset版本&#xff0c;例如devtoolset-9&#xff1a;3. 启用新版本的编译器&#xff1a;4. 检查G版本&#xff1a; 在CentOS系统中升级G编译器通常涉及使用devtoolset或者SCL&…

为什么要学Python?学Python有什么用?

为什么要学Python&#xff1f;学Python有什么用&#xff1f; 在当今的数字化时代&#xff0c;编程已成为一项宝贵的技能。Python&#xff0c;作为一种流行的编程语言&#xff0c;因其易于学习和强大的功能而受到全球开发者的青睐。本文将探讨学习Python的原因和它的实际应用&am…

【组合博弈】介绍

本文为学习笔记&#xff0c;详细内容参考"Lessons in Play,Michael H. Albert Richard J. Nowakowski David Wolfe" 文章目录 组合博弈介绍(Combinatorial Games)DOMINEERING游戏组合游戏选手介绍Options博弈树&#xff08;game tree&#xff09; 组合博弈介绍(Combi…

基于SSM框架多人命题系统

采用技术 基于SSM框架多人命题系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 学生端 登录 个人中心 公告信息 试题信息 管理员 登录 个人信息…

苹果M4芯片:推动AI时代的革新力量

随着科技的飞速发展&#xff0c;苹果公司一直以其创新精神引领着行业潮流。其中&#xff0c;M4芯片的推出无疑是苹果在人工智能领域迈出的重要一步。这款专为机器学习和AI计算而设计的芯片&#xff0c;不仅在新款iPad Pro等消费电子产品上亮相&#xff0c;更是预示着苹果即将开…

【linux】vmtouch文件缓存管理工具

目录 vmtouch简介 用法 例子 统计文件或者目录在缓存中的记录 缓存文件到内存 其他类似工具 vmtouch简介 vmtouch是用c语言编写的文件缓存管理工具&#xff0c;适用用于所有类Unix系统。 作用&#xff1a; 1&#xff0c;查看文件系统缓存情况 2&#xff0c;将文件或目…

JUC下CountDownLatch详解

详细介绍 CountDownLatch是Java并发包java.util.concurrent中提供的一个同步工具类&#xff0c;它允许一个或多个线程等待其他线程完成操作后再继续执行。这个工具类基于一个计数器&#xff0c;计数器的初始值可以由构造函数设定。线程调用countDown()方法会将计数器减1&#x…

Spring Framework-简介

Spring Framework Java Spring是一个开源的Java应用框架&#xff0c;它的主要目的是简化企业级应用开发的复杂性。Spring框架为开发者提供了许多基础功能&#xff0c;使得开发者能够更专注于业务逻辑的实现&#xff0c;而不是底层的细节。 主要特点和功能&#xff1a; 控制反…

Java设计模式 _行为型模式_命令模式

一、命令模式 1、命令模式 命令模式&#xff08;Command Pattern&#xff09;是一种行为型模式&#xff0c;一种数据驱动的设计模式。命令模式中请求以命令的形式包裹在对象中&#xff0c;即将命令封装为类&#xff0c;从而可以使用不同的请求&#xff0c;队列等操作具体的对象…

基于STM32移植lvgl(V8.2)(SPI接口的LCD)

目录 概述 1 认识LVGL 1.1 LVGL官网 1.2 LVGL库文件下载 2 认识SPI接口型LCD 2.1 PIN引脚定义 2.2 MCU IO与LCD PIN对应关系 3 实现LCD驱动 3.1 使用STM32Cube配置Project 3.2 STM32Cube生成工程 4 移植LVGL 4.1 准备移植文件 4.2 添加lvgl库文件到项目 4.2.1 src下…

信息系统项目管理师0101:项目建议与立项申请(7项目立项管理—7.1项目建议与立项申请)

点击查看专栏目录 文章目录 第七章 项目立项管理7.1项目建议与立项申请1.立项申请概念2.项目建议书内容记忆要点总结第七章 项目立项管理 项目立项管理是对拟规划和实施的项目技术上的先进性、适用性,经济上的合理性、效益性,实施上的可能性、风险性以及社会价值的有效性、可…

今日总结2024/5/10

今日复习01背包,完全背包,多重背包DP,以及多重背包优化 01背包 每个物品只能选一次&#xff0c;可以选或不选 f[i,j]表示选到前i个物品体积不超过j的最大价值 状态转移方程为f[i][j]max(f[i-1][j],f[i-1][j-v[i]]w[i]) 优化空间采用滚动数组,从大到小枚举体积即可 完全背…

14:java基础-Tomcat-Web容器

文章目录 面试题Web 容器是什么&#xff1f;HTTP 的本质 面试题 Web 容器是什么&#xff1f; 让我们先来简单回顾一下 Web 技术的发展历史&#xff0c;可以帮助你理解 Web 容器的由来。早期的 Web 应用主要用于浏览新闻等静态页面&#xff0c;HTTP 服务器&#xff08;比如Apa…

学习Java的日子 Day45 HTML常用的标签

Day45 HTML 1.掌握常用的标签 1.1 标题标签 h1-h6 <h1>一级标签</h1> <h2>二级标签</h2> <h3>三级标签</h3> <h4>四级标签</h4> <h5>五级标签</h5> <h6>六级标签</h6> 显示特点&#xff1a; * 文字…

【Java难点】多线程-终极【更新中...】

Java内存模型之JMM 为什么需要JMM 计算机存储结构&#xff1a;从本地磁盘到主存到CPU缓存&#xff0c;也就是从硬盘到内存&#xff0c;到CPU。一般对应的程序的操作就是从数据库查数据到内存然后到CPU进行计算。 CPU和物理主内存的速度不一致&#xff0c;所以设置多级缓存&am…

玩游戏专用远程控制软件

玩游戏专用远程控制软件&#xff1a;实现远程游戏的新体验 随着网络技术的不断发展和创新&#xff0c;远程控制软件已经逐渐渗透到我们生活的方方面面&#xff0c;尤其是在游戏领域。玩游戏专用远程控制软件&#xff0c;作为这一趋势下的产物&#xff0c;为玩家提供了全新的游…

“幽灵“再临!新型攻击瞄准英特尔CPU;微软Outlook漏洞被俄利用,网络间谍攻击捷克德国实体 | 安全周报0510

1. 微软Outlook漏洞被俄罗斯APT28利用&#xff0c;捷克德国实体遭网络间谍攻击&#xff01; 捷克和德国于周五透露&#xff0c;他们成为与俄罗斯有关的APT28组织进行的长期网络间谍活动的目标&#xff0c;此举遭到欧洲联盟&#xff08;E.U.&#xff09;、北大西洋公约组织&…

unreal engine4 创建动画蒙太奇

UE4系列文章目录 文章目录 UE4系列文章目录前言一、创建动画蒙太奇 前言 动画蒙太奇的官方解释&#xff1a;Animation Montages are animation assets that enable you to combine animations in a single asset and control playback using Blueprints.You can use Animation…