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

在这里插入图片描述

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.mzph.cn/news/92008.shtml

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

相关文章

应用架构的演进:亚马逊的微服务实践

当你在亚马逊上购物时,或许不会想到,你看到的这个购物网站,其背后技术架构经历了什么样的变迁与升级。 还记得上世纪 90 年代,那个只卖书的网上书店吗?那时的亚马逊,不过是一个架构简单的网站,所有的功能都堆积在一个庞大的软件堡垒里。随着更多业务的增加、更新和迭代,这个软…

【小程序 - 基础】页面导航、页面事件、生命周期、WXS脚本_04

目录 一、页面导航 1. 什么是页面导航 2. 小程序中实现页面导航的两种方式 2.1 声明式导航 2.1.1 导航到 tabBar 页面 2.1.2 导航到非 tabBar 页面 2.1.3 后退导航 2.2 编程式导航 2.2.1 导航到 tabBar 页面 2.2.2 导航到非 tabBar 页面 2.2.3 后退导航 2.3. 导航…

从1开始的Matlab(快速入门)

MATLAB软件版本&#xff1a;MATLAB R2016b 本文是博主从零开始学Matlab的记录&#xff0c;适合第一次接触Matlab的同学阅读。 一、基础介绍 1.1界面认识 1.2变量命名 注&#xff1a;Matlab中的注释 %% 独占一行的注释&#xff08;有上下横线分割&#xff09; % 普通注释 …

C语言:选择+编程(每日一练Day9)

目录 选择题&#xff1a; 题一&#xff1a; 题二&#xff1a; 题三&#xff1a; 题四&#xff1a; 题五&#xff1a; 编程题&#xff1a; 题一&#xff1a;自除数 思路一&#xff1a; 题二&#xff1a;除自身以外数组的乘积 思路二&#xff1a; 本人实力有限可能对…

深入理解 Swift 新并发模型中 Actor 的重入(Reentrancy)问题

问题现象 我们知道,Swift 5.5 引入的新并发模型极大简化了并行逻辑代码的开发,更重要的是:使用新并发模型中的 Actor 原语可以大大降低并发数据竞争的可能性。 不过,即便 Actor 有如此神奇之功效,它也不是“万能药”,仍不能防止误用带来的问题。比如:Actor 重入(Reen…

283. 多边形,《算法竞赛进阶指南》,

283. 多边形 - AcWing题库 “多边形游戏”是一款单人益智游戏。 游戏开始时&#xff0c;给定玩家一个具有 N 个顶点 N 条边&#xff08;编号 1∼N&#xff09;的多边形&#xff0c;如图 1 所示&#xff0c;其中 N4 每个顶点上写有一个整数&#xff0c;每个边上标有一个运算符…

数据分析方法:RFM模型

一、RFM基本原理 RFM是三个单词的缩写&#xff1a; 最近一次消费时间&#xff08;Recency&#xff09;&#xff0c;取数的时候一般取最近一次消费记录到当前时间的间隔&#xff0c;比如&#xff1a;7天、30天、90天未到店消费&#xff1b;直观上&#xff0c;一个用户太久不到…

MySql进阶篇---006:存储引擎,索引,SQL优化,视图、存储过程、变量、流程控制、游标、存储函数、触发器

1. 存储引擎 1.1 MySQL体系结构 1).连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念&#xff0c;为通过认证…

Redis与分布式-主从复制

接上文 常用中间件-OAuth2 1.主从复制 启动两个redis服务器。 修改第一个服务器地址 修改第二个redis 然后分别启动 redis-server.exe redis.windows.conf) 查看当前服务器的主从状态&#xff0c;打开客户端&#xff1a;输入info replication命令来查看当前的主从状态&am…

2023/10/1 -- ARM

今日任务&#xff1a;select实现服务器并发 ser.c&#xff1a; #include <myhead.h>#define ERR_MSG(msg) do{\printf("%d\n",__LINE__);\perror(msg);\ }while(0)#define PORT 8888#define IP "192.168.1.5"int main(int argc, const char *argv[…

ElementUI动态树,数据表格以及分页的实现

目录 前言 一. ElementUI动态树 二. 数据表格和分页 三. 后端代码 service层 controller层 前言 在上一篇博客中实现了左侧菜单栏&#xff0c;在此基础上将它变为动态的&#xff0c;即动态的展示数据库的数据。还有数据表格的实现以及分页。&#xff08;纯代码分享&#…

新闻报道的未来:自动化新闻生成与爬虫技术

概述 自动化新闻生成是一种利用自然语言处理和机器学习技术&#xff0c;从结构化数据中提取信息并生成新闻文章的方法。它可以实现大规模、高效、多样的新闻内容生产。然而&#xff0c;要实现自动化新闻生成&#xff0c;首先需要获取可靠的数据源。这就需要使用爬虫技术&#…

步进电机只响不转

我出现问题的原因是相位线接错。 我使用的滑台上示17H的步进电机&#xff0c;之前用的是57的步进电机。 57步进电机的相位线是A黑、A-绿、B红、B-蓝。 17步进电机的相位线是A红、A-绿、B黑、B-蓝。 这两天被一个问题困扰了好久&#xff0c;在调试步进电机开发板的时候电机发生…

分类预测 | Matlab实现SSA-CNN-SVM麻雀算法优化卷积支持向量机分类预测

分类预测 | Matlab实现SSA-CNN-SVM麻雀算法优化卷积支持向量机分类预测 目录 分类预测 | Matlab实现SSA-CNN-SVM麻雀算法优化卷积支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SSA-CNN-SVM麻雀算法优化卷积支持向量机分类预测&#xff0…

Sentinel学习(1)——CAP理论,微服务中的雪崩问题,和Hystix的解决方案 Sentinel的相关概念 + 下载运行

前言 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 本篇博客介绍CAP理论&#xff0c;微…

Plant Simulation双深位库堆垛库

Plant Simulation双深位库堆垛库视频演示 自定义多入口&#xff0c;多出口 Plant Simulation双深位库堆垛库

【面试经典150 | 矩阵】螺旋矩阵

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;模拟方法二&#xff1a;按层模拟 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于…

【数据结构】选择排序 堆排序(二)

目录 一&#xff0c;选择排序 1&#xff0c;基本思想 2&#xff0c; 基本思路 3&#xff0c;思路实现 二&#xff0c;堆排序 1&#xff0c;直接选择排序的特性总结&#xff1a; 2&#xff0c;思路实现 3&#xff0c;源代码 最后祝大家国庆快乐&#xff01; 一&#xf…

测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)

文章目录 一、任务描述二、指标分析2.1 TP/FP/FN/TN2.2 精准率2.3 召回率 三、接口处理四、数据集处理五、开始计算指标五、实用工具5.1 移动文件5.2 可视化JSON标签5.3 可视化TXT标签 一、任务描述 通过给定的算法接口&#xff0c;对算法的输出&#xff08;置信度、检测框、告…

英飞凌 Tricore 架构中断系统详解

本文以TC3系列MCU为例&#xff0c;先来了解中断源是如何产生的&#xff0c;再看一下CPU是如何处理中断源的。 AURIX TC3XX的中断路由模块 Interrupt Router (IR) 在TC3中&#xff0c;中断既可以被CPU处理&#xff0c;也可以被DMA处理&#xff0c;所以手册中不再把中断称为中断…