(2)滑动窗口算法练习:无重复字符的最长子串

news2024/9/20 1:03:47

无重复字符的最长子串

题目链接:3. 无重复字符的最长子串 - 力扣(LeetCode)

给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。

输入: s = "abcabcbb"

输出: 3

解释: 因为无重复字符的最长子串是"abc",所以其长度为 3。

思路解析:

本题的暴力解法为两层for循环遍历+hash判断是否重复,时间复杂度为O(N^2),根据暴力解法可以进一步优化将时间复杂度降低到O(N)

以示例数组为例

正向性:定义一个left和一个right指针,二者指向第一个字符。在遍历的过程中,right指针向右移动,直到遇到一个已经出现的字符停止,此时right指针是否需要回退呢?答案是不需要,因为当right指针遇到已经出现过的字符后,left指针就会开始移动,如果left++,则下一个字符为b,此时在区间(left=1)[left, right]中不存在已经重复的字符,因为已经跳过了重复的字符a。所以,left指针和right指针在移动的过程中均满足从左向右移动不回退

在上面的示例中,重复字符为第一个字符,考虑示例:s="deabcabcbb"。在该示例中,right向右移动一直到第二个字符a,此时[left, right]中存在重复字符a,停止移动right,接下来移动left,那么left是否需要一次只移动1个长度呢?不需要,原因很简单,left++后下一个区间(left=1)[left, right]起始字符为e,而对应区间中的子串为eabca,仍然存在重复字符a,所以left在移动时并不是每一次都只移动1个长度(即只循环一次),只需要让left移动到当前区间第一个重复字符的下一个字符b的位置即可,所以需要使用循环来让left一直移动直到跳过重复字符

对于哈希表的处理,不需要使用库中的结构,因为题目中给出了结果s的取值只会出现英文字母、数字、符号和空格,所以只需要定义一个长度为128的数组即可,对应的下标即为对应字符的ASCII码值

根据上面的分析,因为leftright在遍历的过程中不需要回退,所以可以考虑使用滑动窗口算法解决,步骤如下:

  1. 进窗口:本题进窗口意味着只要元素没有在哈希表数组中就进入哈希表数组

  2. 判断:因为遇到重复的字符right就停止移动,所以当哈希表数组字符ASCII值下标对应的元素不为0即代表重复,作为判断条件

  3. 出窗口:出窗口则意味着已经在哈希表中的元素需要离开哈希表,并让left向后移动,需要注意的是,因为需要进入一个新的窗口,所以出窗口时需要使left位置的字符对应哈希数组下标值的元素出现的次数改变

  4. 更新结果:本题更新结果只需要在[left, right]区间没有重复字符后即可,用变量len存储子串长度,再移动right

具体步骤如下:

参考代码:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int hash[128] = {0}; // 创建hash表
        int len = 0;
        for(int left = 0, right = 0; right < s.size(); right++)
        {
            hash[s[right]]++; // 标记已经出现
            // 判断
            while(hash[s[right]] > 1)
            {
                hash[s[left++]]--;// 出窗口
            }
            len = max(len, right - left + 1);// 更新结果
        }

        return len;
    }
};

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

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

相关文章

Java字符串(String、字符串拼接、原理)

文章目录 一、String字符串1.1创建方式【直接赋值、new一个对象】1.1.1 使用字符串字面值直接赋值&#xff1a;&#xff08;1&#xff09;字符串字面量创建String对象的转换过程&#xff08;2&#xff09;一些方法&#xff08;3&#xff09;说明 1.1.2 使用new关键字创建字符串…

Java如何自定义注解及在SpringBoot中的应用

注解 注解&#xff08;Annotation&#xff09;&#xff0c;也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性&#xff0c;与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面&#xff0c;用来对这些元素进行说…

最快视频转绘-AnimateDiff-Lightning

最快视频转绘-AnimateDiff-Lightning Video-to-Video Generation AnimateDiff-Lightning 非常适合视频到视频的生成。使用 ControlNet 提供最简单的 comfyui 工作流程。 「ComfyUI-aki-v1.3.7z」链接&#xff1a;https://pan.quark.cn/s/199a753292d8 下载导入工作流 animat…

182440-00SF 同轴连接器

型号简介 182440-00SF是Southwest Microwave的一款连接器。该连接器采用 BeCu UNqS C17300 材料&#xff0c;并进行了镀金处理&#xff0c;以确保良好的导电性和耐腐蚀性&#xff1b;螺纹采用符合 ASTM A2582 标准的钢制合金&#xff0c;并进行磷酸盐钝化处理&#xff0c;以提高…

FunAudioLLM SenseVoice语音转录与CosyVoice语音合成及语音克隆使用案例

参考: https://fun-audio-llm.github.io/ 1、SenseVoice语音转录 在线体验:https://modelscope.cn/studios/iic/CosyVoice-300M 参考:https://github.com/FunAudioLLM/SenseVoice 下载: pip install -U funasr使用: from funasr import AutoModelmodel_dir = "…

如何从 Vue 2 无痛升级到 Vue 3,一文搞定!

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 随着 Vue 3 的发布,许多开发者都面临着从 Vue 2 升级到 Vue 3 的挑战。 本文将详细介绍如何从 Vue 2 无痛升级到 Vue 3,包括每个步骤的详细说明与代码示例。 让我们开始吧! 准备工作 在正式开始升级之前,请确保你已经…

Linux网络命令:网络工具socat详解

目录 一、概述 二、基本用法 1、基本语法 2、常用选项 3、获取帮助 三、用法示例 1. 监听 TCP 端口并回显接收到的数据 2. 通过 TCP 端口转发数据到 UNIX 套接字 3. 将文件内容发送到 TCP 端口&#xff1a; 4. 使用伪终端进行串行通信 5、启动一个TCP服务器 6、建…

【Linux】网络新兵连

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 在上一篇博客中&#xff0c;我们简单的介绍了一些Linux网络一些比较基本的概念。本篇博客我们将开始正式学习Linux网络套接字的内容&#xff0c;那么我们开始吧&#xff01; 1.网络中的地址管理 大家一…

【Linux】多线程_2

文章目录 九、多线程2. 线程的控制 未完待续 九、多线程 2. 线程的控制 主线程退出 等同于 进程退出 等同于 所有线程都退出。为了避免主线程退出&#xff0c;但是新线程并没有执行完自己的任务的问题&#xff0c;主线程同样要跟进程一样等待新线程返回。 pthread_join 函数…

搜维尔科技:OptiTrack在NAB2024展示了一系列业界领先的媒体技术

广泛的显示和动作捕捉跟踪技术组合涵盖无与伦比的室内和室外 LED 解决方案、前沿技术演示以及最新的软件和硬件产品 可视化技术领域的全球领导者 Planar及其附属公司 3D 跟踪系统的全球领导者OptiTrack宣布&#xff0c;两家公司将在 2024 年全国广播协会 (NAB) 展会上展示其最全…

【动态规划Ⅴ】二维数组的动态规划——0/1矩阵、最大正方形

二维数组的动态规划——0/1矩阵、最大正方形 最大正方形1277. 统计全为 1 的正方形子矩阵221. 最大正方形 01矩阵542. 01 矩阵 最大正方形 下面两个题目是非常相似的&#xff0c;只是一个统计正方形数目&#xff0c;一个统计最大正方形的面积。 1277. 统计全为 1 的正方形子矩…

【优先级队列PriorityQueue】

目录 1&#xff0c;优先级队列 1.1 概念 2&#xff0c;优先级队列的模拟实现 2.1 堆的概念 2.2 堆的存储方式 2.3 堆的创建 2.3.1 堆的向下调整&#xff08;大根堆&#xff09; 2.3.2 建堆的时间复杂度​编辑 2.4 堆的插入与删除 2.4.1 堆的插入 2.4.2 堆的删除 3&a…

源码编译构建LAMP(企业网站架构部署与优化)

部署LAMP平台 LAMV架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c;能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词&#xff0c;具体包 括 Linux操作系统&#xff0c;Apache网站服务器、MySQL数据库服务器、P…

ElementPlusError: [ElPagination] 你使用了一些已被废弃的用法,请参考 el-pagination 的官方文档 - 报警告之一

一、问题描述&#xff1a; 今天在使用elementui plus的时候遇到了一个奇葩的问题&#xff0c; 就是提示 使用了一些已被废弃的用法&#xff0c; 奇葩就在于我是 复制另一个页面的分页&#xff0c; 一摸一样的东西&#xff0c;就只这个页面报错&#xff0c; 分页也不出 为了这个…

App Cleaner Uninstaller 8.3.0激活版 最佳卸载程序和清理助手

App Cleaner & Uninstaller 完全安全地删除 Mac 上的程序&#xff0c;删除应用程序的残留物&#xff0c;管理扩展程序和启动程序。 App Cleaner & Uninstaller 8.3.0激活版下载 卸载应用程序和所有不需要的垃圾文件 当您将应用程序拖放到废纸篓时&#xff0c;请检查您…

鸿蒙开发学习笔记1

一、下载 deveco-studio 编译器 https://developer.huawei.com/consumer/cn/deveco-studio/#download 二、ArkTs 0、基本数据类型&#xff1a; 3种&#xff1a;string、number、boolean 1、存储数据&#xff08;变量、常量&#xff09; 注&#xff1a;类似于 ts 使用 con…

【work】AI八股-神经网络相关

Deep-Learning-Interview-Book/docs/深度学习.md at master amusi/Deep-Learning-Interview-Book GitHub 网上相关总结&#xff1a; 小菜鸡写一写基础深度学习的问题&#xff08;复制大佬的&#xff0c;自己复习用&#xff09; - 知乎 (zhihu.com) CV面试问题准备持续更新贴 …

springboot中@bean注解的创建和使用

bean的创建顺序 在Spring Boot中&#xff0c;当一个配置类&#xff08;使用Configuration注解的类&#xff09;中定义了多个bean时&#xff0c;这些bean的创建顺序并不完全由它们在类中的声明顺序决定。Spring框架在创建和管理bean时&#xff0c;遵循了复杂的依赖注入和生命周…

什么,有狗快跑!慢着,这次手把手教你怎么过安全狗!(sql注入篇)

前言 在记忆里上次绕安全狗还是在上次&#xff0c;开开心心把自己之前绕过狗的payload拿出来&#xff0c;发现全部被拦截了&#xff0c;事情一下子就严肃起来了&#xff0c;这就开整。 环境 本次环境如下sqli-lab的sql注入靶场 网站安全狗APACHE版V4.0版本的最高防护等级绕过…

北京大学长安汽车发布毫米波与相机融合模型RCBEVDet:最快能达到每秒28帧

Abstract 三维目标检测是自动驾驶中的关键任务之一。为了在实际应用中降低成本&#xff0c;提出了利用低成本的多视角相机进行3D目标检测&#xff0c;以取代昂贵的LiDAR传感器。然而&#xff0c;仅依靠相机很难实现高精度和鲁棒性的3D目标检测。解决这一问题的有效方法是将多视…