【LeetCode】滑动窗口妙解无重复字符的最长子串

news2024/11/29 4:00:51

在这里插入图片描述

Problem: 3. 无重复字符的最长子串

文章目录

  • 思路
  • 算法原理分析
    • 暴力枚举 + 哈希表
    • 滑动窗口
  • 复杂度
  • Code

思路

首先我们来分析一下本题的思路

  • 如果读者有看过 长度最小的子数组 的话就可以清楚这个子串其实和子数组是一个道理,都是 连续的一段区间
  • 但是呢它们本质上还是存在一定区别的,这里说到是要我们去寻找不含有重复字符的【最长子串】, 读者可以看看下面我对这三个示例的分析
    • 对于示例1其最多长度只能为3
    • 对于示例2因为每一个都是一样的为b,那么最长子序列的长度即为1
    • 对于示例3的话这个大小也是一样为3

1.jpg

💬 所以到现在读者应该可以清楚题目到底是要我们做什么,接下去我们就具体地来讲解该如何去求解这个最长子串的长度

算法原理分析

马上我们通过两种解法来分析一下该如何去求解本题💡

暴力枚举 + 哈希表

首先要给大家介绍的肯定是暴力枚举,不过我们要通过【哈希表】来进行配合,如果对这个数据结构不太了解的话可以看看 一文带你快速入门哈希表

  • 不过呢,我们还是以双指针的模型来解题,右指针right用来遍历字符并将其放入哈希表中

2.jpg

  • 然后当这个right指针不断向后进行遍历的时候,将所遇到的字符全部放入哈希表中,最后当遇到有重复字符的时候,就停下来

3.jpg

  • 那么对于暴力解法来说的话,就会来到e这个位置,然后让right继续从这个位置开始向后进行移动,那么此时就可以清楚其会遍历到之前所碰到的那个重复的字符a;很明显,这是多此一举的做法

4.jpg

  • 因为我们所重复的是这个a,[d, e] 这个区间内并没有这个重复的元素a,所以呢这个right指针撑死了只能跑到这个第二次重复的位置

5.jpg

  • 所以我们在发现有重复元素需要进行第二次遍历的时候应该让这个left指针跑过这个重复元素才对,而且这个right指针不需要再回到当前left所在位置,而是直接从那个重复元素的位置开始向后遍历即可

6.jpg

滑动窗口

对于上面的这一种思想,我们就称之为【滑动窗口】

  • 我们来捋一下这个滑动窗口的逻辑:

    1. 首先让leftright指针同时指向0的位置,遇到字符就往哈希表中放入字符
    2. 随着字符慢慢放入的时候,当窗口内出现了重复字符的时候,就需要从哈希表中删除该字符
    3. 接着去更新我们所需要的结果(最长子串的长度)即可。最后直到这个right超出边界之后,返回最终的那个结果
  • 以上就是本题使用滑动窗口进行求解的所有流程,读者可以根据这个思路顺利一遍逻辑,然后试着写写看代码

7.jpg

本题是我们滑动窗口的第二题了,如果有看过上一篇题解的读者应该可以知道对于滑动窗口而言,其代码是差不多的,读者在解决此类问题的时候不仅要知道我们为什么要利用【滑动窗口】去解决本题,而且还需要明白为什么使用【滑动窗口】来解决本题,这样大家在遇到类似题目的时候就可以很快地想到对应的解决策略✔

复杂度

  • 时间复杂度:

对于时间复杂度而言,读者在看了以下代码的时候,不要就认为两层循环就是 O ( n 2 ) O(n^2) O(n2),从开始到结束其实leftright指针各自遍历了一遍这个数组,所以最后的时间复杂度即为 O ( n ) O(n) O(n)

8.jpg

  • 空间复杂度:

没有在堆区上申请任何空间,所以空间复杂度为 O ( 1 ) O(1) O(1)

Code

以下是整体的代码展示

  • 为了照顾没学习过哈希表的同学,我使用数组来模拟的哈希表,其实数组的结构和哈希表挺类似的,也是下标和数组元素之间的映射关系,所以读者完全不用担心自己没有学习过哈希表
  • 如果你有认真分析过思路的话对下面的代码就会感觉到非常地清晰哦(๑•̀ㅂ•́)و✧
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n = s.size();
        int len = INT_MIN;
        int hash[128] = {0};    // 使用数组来模拟哈希表
        for(int left = 0, right = 0; right < n; ++right)
        {
            // 进窗口
            hash[s[right]]++;
            // 若发现有重复的字符出现
            while(hash[s[right]] > 1)
            {
                hash[s[left++]]--;      // 将字符从数组中移除
            }
            // 更新长度
            len = max(len, right - left + 1);
        }
        return len == INT_MIN ? 0 : len;
    }
};

在这里插入图片描述

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

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

相关文章

【数据结构】队列和栈

大家中秋节快乐&#xff0c;玩了好几天没有学习&#xff0c;今天分享的是栈以及队列的相关知识&#xff0c;以及栈和队列相关的面试题 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作…

Java字符缓冲流自己特有的方法进行读入和写出

代码如下&#xff1a; public class MyWork {public static void main(String[] args) throws IOException{BufferedReader fr new BufferedReader(new FileReader("myfile/abc.txt"));BufferedWriter fw new BufferedWriter(new FileWriter("myfile/test.tx…

(一)gitblit安装教程

(一)gitblit安装教程 (二) gitblit用户使用教程 (三) gitblit管理员手册 目录 前言安装1.下载Java Runtime Requirement 2.设置环境变量3.gitblit内容3.1 gitblit文件夹内容3.2 defaults.properties 主要配置选项 4 配置4.1 准备文件4.2 修改gitblit.properties4.3 修改authori…

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 E: 数三角

[蓝桥杯 2023 国 B] 数三角 【问题描述】 小明在二维坐标系中放置了 n n n 个点&#xff0c;他想在其中选出一个包含三个点的子集&#xff0c;这三个点能组成三角形。然而这样的方案太多了&#xff0c;他决定只选择那些可以组成等腰三角形的方案。请帮他计算出一共有多少种选…

凉鞋的 Unity 笔记 101. Hello Unity

101. Hello Unity 学习任何一门技术&#xff0c;第一件事就是先完成 Hello World&#xff01;的输出 所以我们来完成 Unity 的 Hello World。 我们所使用的 Unity 版本是 2023.x 版本。 安装的过程就不给大家展示了。 我们从新建项目开始。 新建项目 打开 Unity Hub 后&…

商圣范蠡见好就收,散尽钱财求得好死

有所得必有所失&#xff0c;有所利必有所害。 人弃我捡&#xff0c;人争我弃。 巴菲特说过&#xff1a;“别人恐惧我贪婪&#xff0c;别人贪婪我恐惧。” 一、商圣 公元前536年&#xff0c;范蠡出生在楚国&#xff0c;家境贫寒。范蠡&#xff0c;字少伯。虽然家里穷&#xf…

大数据Doris(三):Doris编译部署篇

文章目录 Doris编译部署篇 一、Doris编译

装饰器模式详解和实现

装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你动态地将对象添加到现有对象中&#xff0c;以提供额外的功能&#xff0c;同时又不影响其他对象。 实现示例 1.定义一个接口或抽象类&#xff0c;表示被装饰对象的公共接口 //抽…

[02] Multi-sensor KIT: DSP 矩阵运算-加法,减法和逆矩阵,放缩,乘法和转置矩阵

1.概述 2.API ◄ arm_mat_init_f32 浮点矩阵初始化 ◄ arm_mat_add_f32 矩阵加法 ◄ arm_mat_mult_f32 矩阵乘法 ◄ arm_mat_inverse_f32 矩阵A的逆矩阵 ◄ arm_mat_scale_f32 矩阵A乘以系数 ◄ arm_mat_inverse_f32 矩阵A减法 ◄ arm_mat_inverse_f32 矩阵A的装置 3.矩阵初…

Spring Security 简单token配置

Spring Security 简单token配置 说明&#xff1a;非表单配置 先上码&#xff1a; https://gitee.com/qkzztx_admin/security-demo/tree/master/demo-two 环境&#xff1a;win10 idea2023 springboot2.7.6 maven3.8.6 代码清单说明 依赖&#xff1a; <dependency><…

mysql报错:Column Count Doesn‘t Match Value Count at Row 1

mysql中执行insert、update、delete报错&#xff1a;Column Count Doesnt Match Value Count at Row 1 的解决方案 通常情况&#xff1a;字段不匹配 如&#xff1a;student有id, name, age字段 -- 错误写法 INSERT INTO student VALUES(5,horse)-- 正确写法 INSERT INTO stu…

【JavaEE】CAS(Compare And Swap)操作

文章目录 什么是 CASCAS 的应用如何使用 CAS 操作实现自旋锁CAS 的 ABA 问题CAS 相关面试题 什么是 CAS CAS&#xff08;Compare and Swap&#xff09;是一种原子操作&#xff0c;用于在无锁情况下保证数据一致性的问题。它包含三个操作数——内存位置、预期原值及更新值。在执…

ElasticSearch 10000条查询数量限制

一、前言 我们将库存快照数据导入ES后发现要分页查询10000条以后的记录会报错&#xff0c;这是因为ES通过index.max_result_window这个参数控制能够获取数据总数fromsize最大值&#xff0c;默认限制是10000条&#xff0c;因为ES考虑到数据要从其它节点上报到协调节点如果搜索请…

【Java 进阶篇】MySQL启动与关闭、目录结构以及 SQL 相关概念

MySQL 服务启动与关闭 MySQL是一个常用的关系型数据库管理系统&#xff0c;通过启动和关闭MySQL服务&#xff0c;可以控制数据库的运行状态。本节将介绍如何在Windows和Linux系统上启动和关闭MySQL服务。 在Windows上启动和关闭MySQL服务 启动MySQL服务 在Windows上&#x…

基于Java的毕业设计管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

Vue iconfont-阿里巴巴矢量图标库用法

一、vue使用 选择心仪的图标 加入购物车 点击右上角购物车&#xff0c;点击添加至项目 在资源管理 可以看到我的项目 进入项目设置勾选彩色 点击下载到本地 解压压缩包 在main.js文件内导入css文件 import "/assets/font_icon/iconfont.css"; 使用&#xff1a; 复…

第80步 时间序列建模实战:GRNN回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们使用Matlab进行GRNN模型的构建。 使用的数据如下&#xff1a; 采用《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndrom…

嵌入式学习笔记(36)什么是定时器

7.1.1定时器是SoC中常见外设 (1)定时器与计数器。计数器是用来计数的&#xff08;每隔一个固定时间会计一个数&#xff09;&#xff1b;因为计数器的计数时间周期是固定的&#xff0c;因此到了一定时间只要用计数值*技术实践周期&#xff0c;就能得到一个时间段&#xff0c;这…

计算机网络笔记 第一章 概述

课程链接 https://www.bilibili.com/video/BV1c4411d7jb/?spm_id_from333.337.search-card.all.click 1.2 因特网概述 网络、互联网与因特网的区别与关系 若干节点和链路互相形成网络若干网络通过路由器互联形成互联网因特网是当今世界上最大的互联网 我们有时并没有严格区…

ARM底层汇编基础指令

汇编语言的组成 伪操作 不参与程序执行&#xff0c;但是用于告诉编译器程序怎么编译.text .global .end .if .else .endif .data 汇编指令 编译器将一条汇编指令编译成一条机器码&#xff0c;在内存里一条指令占4字节内存&#xff0c;一条指令可以实现一个特定的功能 伪指令 不…