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

news2024/9/30 5:33:50

一、等差数列划分

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.coloradmin.cn/o/1662565.html

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

相关文章

基于MWORKS 2024a的MIMO-OFDM 无线通信系统设计

一、引言 在终端设备和数据流量爆发式增长的今天&#xff0c;如何提升通信系统容量、能量效率和频谱利用率成为5G通信的关键问题之一。大规模天线阵列作为5G及B5G无线通信关键技术通过把原有发送端天线数量提升一个或多个数量级&#xff0c;实现波束聚集、控制波束转向&#x…

钒回收树脂五氧化二钒净化回收工艺

钒是一种重要的工业金属&#xff0c;广泛应用于钢铁合金、化工、航空和电池材料等领域。随着资源的日益紧张和环保要求的提高&#xff0c;回收利用钒成为了一个重要的研究方向。树脂吸附技术是一种常用的从废水或废料中回收钒的方法&#xff0c;具有操作简便、效率高、成本相对…

OpenCV中的模块:点云配准

点云配准是点云相关的经典应用之一。配准的目的是估计两个点云之间位姿关系从而完成两者对应点之间的对齐/对应,因而在英文中又叫“align”、“correspondence”。笔者曾经是基于OpenCV进行三维重建的,并且从事过基于深度学习的6DoF位置估计等工作。在这些工作中,除了重建点…

Ansible的安装与配置

Ansible的安装与配置 1. 安装ansible # ansible是epel源提供的&#xff0c;所以必须安装epel&#xff1a; [rootRocky9 ~]# yum -y install epel-release Last metadata expiration check: 0:01:53 ago on Tue 26 Dec 2023 10:05:34 PM CST. Dependencies resolved. Package …

如何在 CentOS 上安装并配置 Redis

如何在 CentOS 上安装并配置 Redis 但是太阳&#xff0c;他每时每刻都是夕阳也都是旭日。当他熄灭着走下山去收尽苍凉残照之际&#xff0c;正是他在另一面燃烧着爬上山巅散烈烈朝晖之时。 ——史铁生 环境准备 本教程将在 CentOS 7 或 CentOS 8 上进行。确保你的系统已更新到最…

Java入门基础学习笔记7——Intellij IDEA开发工具概述、安装

之前的开发工具存在一些问题&#xff1a; 文本编辑工具&#xff1a;记事本、NotePad、EditPlus、Sublime...编写代码的时候没有错误提醒、没有智能代码提示、需要自己进行编译、执行、功能不够强大。 集成开发环境&#xff08;IDE&#xff1a;Integrated Development Environm…

Python 3 中zip()函数的用法

1 创作灵感 我们在阅读代码的时候&#xff0c;经常会看到zip函数&#xff0c;有的时候还和循环在一起用&#xff0c;今天举几个例子测试一下该函数的用法 2.应用举例 &#xff08;1&#xff09;定义了两个列表一个是num,一个是letter (2)使用zip可以把num列表和letter列表中…

k8s遇到的常见问题及解决

1. error: open /var/lib/kubelet/config.yaml: no such file or directory 解决&#xff1a;关键文件缺失&#xff0c;多发生于没有做 kubeadm init就运行了systemctl start kubelet。 要先成功运行kubeadm init 2. 执行初始化kubeadm init ------的时候报错 The HTTP call…

视频批量剪辑高效掌握,轻松驾驭视频制作,播放速度与帧数尽在掌控

在追求速度与激情的视频制作世界里&#xff0c;你是否曾渴望拥有一款能够轻松调整播放速度和秒数的神器&#xff1f;现在&#xff0c;这款神器已经来到了你的身边&#xff0c;让你在视频制作的道路上更加得心应手&#xff0c;效率倍增&#xff01; 首先&#xff0c;我们要进入媒…

机器学习-L1正则/L2正则

机器学习-L1正则/L2正则 目录 1.L1正则 2.L2正则 3.结合 1.L1正则 L1正则是一种用来约束模型参数的技术&#xff0c;常用于机器学习和统计建模中&#xff0c;特别是在处理特征选择问题时非常有用。 想象一下&#xff0c;你在装备行囊准备去旅行&#xff0c;但你的行囊有一…

如何用python的Turtle绘画?

目录 一、画一个圆和正方形 二、简单的方式来画一个美女 三、Turtle是一个用于绘制图形的标准库 一、画一个圆和正方形 import turtle# 创建一个图形窗口 window turtle.Screen() window.bgcolor("white")# 创建一个海龟画笔 pen turtle.Turtle() pen.shape(&q…

Maven 插件使用

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

使用Flask-Admin创建强大的后台管理系统

文章目录 安装Flask-Admin创建Flask应用添加Flask-Admin添加模型扩展延伸自定义视图权限管理文件上传 结语 在Web应用开发中&#xff0c;后台管理系统是至关重要的组成部分&#xff0c;它能够让管理员轻松管理应用的各种数据和配置。Flask-Admin是一个功能强大的Flask扩展&…

2024-05-10 C语言使用开源的JPEG解码库libjpeg 读取JPEG文件并将其解码为RGB24格式的数据

一、可以使用开源的JPEG解码库&#xff0c;例如libjpeg库&#xff0c;来读取JPEG文件并将其解码为RGB24格式的数据。 二、在ubuntu上面进行测试。 2.1安装了libjpeg-dev包 sudo apt-get install libjpeg-dev 2.2 测试c源码 #include <stdio.h> #include <stdlib.h&…

ssrf(第二弹)

四&#xff0c;post请求 1.打开环境&#xff0c;提示说发一个HTTP POST请求&#xff0c;ssrf是用php的curl实现的.并且会跟踪302跳转。 2.用dirsearch扫一下常见的端口&#xff0c;看到有三个可以访问的页面 3.构造伪协议&#xff0c;因为要通过172.0.0.1访问&#xff0c;我们…

在centos7中运行向量数据库PostgreSQL连接不上如何排查?

1. 检查 PostgreSQL 服务状态 首先&#xff0c;您需要确认 PostgreSQL 服务是否正在运行。您可以使用以下命令来检查服务状态&#xff1a; sudo systemctl status postgresql如果服务没有运行&#xff0c;您需要启动它&#xff1a; sudo systemctl start postgresql2. 确认 …

activiti 工作流基本使用

Activiti 介绍 Activiti 是一个开源架构的工作流引擎&#xff0c;基于bpmn2.0 标准进行流程定义。其前身是JBPM&#xff0c;Activiti 通过嵌入到业务系统开发中进行使用。 官方是这样介绍 activiti的&#xff1a; Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎&…

【百家稷学】大语言模型核心算法原理与综合实践(北京信息科技大学实训)...

继续咱们百家稷学专题&#xff0c;本次是有三AI在北京信息科技大学进行的培训。百家稷学专题的目标&#xff0c;是走进100所高校和企业进行学习与分享。 分享主题 本次分享是在北京信息科技大学&#xff0c;面向全校学生报名&#xff0c;主题是《大语言模型核心算法原理与综合实…

HaDoop Hive

目录 1.VMware 的配置 2.JDK的部署 3.防火墙&#xff0c;SElinux&#xff0c;时间同步设置 4.云平台 5.阿里云 6.UCloud 7.Hadoop理论 7.1 Hadoop理论 7.2 VMware Hadoop实践 7.3集群部署常见问题解决 7.4 云服务器上 Hadoop实践 7.5 HDFS 的 shell 7.6…

Vitis HLS 学习笔记--理解串流Stream(3)

目录 1. 简介 2. 综合报告的差别 2.1 包含 do-while 2.2 不包含 do-while 2.3 报告差异分析 3. 总结 1. 简介 针对《Vitis HLS 学习笔记--理解串流Stream(2)-CSDN博客》博文的内容&#xff0c;做进一步说明。 2. 综合报告的差别 2.1 包含 do-while Performance & …