【力扣】无重复字符的最长子串,滑动窗口 + 哈希集合

无重复字符的最长子串原题地址

方法一:滑动窗口(双指针) + 哈希集合

考虑找出字符串s的所有的无重复字符的子串,求出这些子串长度的最大值即可。

使用下标 [left,right] 来维护子串。我们只需要找到每一个 left 对应的所有 right 即可,换句话说,固定了 left 之后,我们让 right 从 left 的位置开始,向后滑动,直到 [left,right] 出现重复字符为止。

以下为所有无重复字符的子串:

(a) b c a b c b b
(a b) c a b c b b
(a b c) a b c b b
a (b) c a b c b b
a (b c) a b c b b
a (b c a) b c b b
a b (c) a b c b b
a b (c a) b c b b
a b (c a b) c b b
a b c (a) b c b b
a b c (a b) c b b
a b c (a b c) b b
a b c a (b) c b b
a b c a (b c) b b
a b c a b (c) b b
a b c a b (c b) b
a b c a b c (b) b
a b c a b c b (b)

由于我们要找的是这些子串中最长的那个,所以固定 left 后,先让 right 右移至出现重复字符或者 right 移动到字符串的末尾,再统计该子串的长度,即 right-left+1 ,求出其中的最大值即可。

需要统计如下子串的长度:

(a b c) a b c b b
a (b c a) b c b b
a b (c a b) c b b
a b c (a b c) b b
a b c a (b c) b b
a b c a b (c b) b
a b c a b c (b) b
a b c a b c b (b)

显然,当某条子串 [left,right] 的右端点 right 已经到达字符串的末尾时,若 left 继续右移,只会缩短子串长度,所以此时无需继续统计

为了判断子串是否已经出现重复字符,可以利用哈希集合(如 C++ 中的 unordered_set<char> ),来存储 [left,right] 中的所有字符,当 right 右移时,就把最右边的字符添加到哈希集合中;当 left 右移时,就把最左边的字符从哈希集合中删除。这样,每次只需判断子串新增加的字符是否已经在哈希集合中出现过即可。

// 方法一:滑动窗口
class Solution
{
public:int lengthOfLongestSubstring(string s){if (s.empty()){return 0;}unordered_set<char> us;int ans = 0;// [left,right] 表示子串int left = 0, right = 0;us.insert(s[0]);while (1){// 右指针右移,直到出现重复字符while (right + 1 < s.size() && !us.count(s[right + 1])){us.insert(s[++right]);}// 子串长度为 right-left+1ans = max(ans, right - left + 1);// 右指针走到尾,子串不可能更长if (right == s.size() - 1){break;}// 左指针右移,在哈希表中去掉最左边的字符us.erase(s[left++]);}return ans;}
};

方法二:对方法一的优化,实现左指针 left 的快速跳转

方法一是固定 left ,让 right 尽可能右移,从而统计所有的 [left,right] 区间长度 right-left+1 的最大值,这样最坏情况下 left 会遍历完整个字符串。

考虑用 key-value 模型的哈希表(如 C++ 中的 unordered_set<char, int> ),每次把 [0,right] 的字符及其对应下标都存进去。

我们用 right 遍历字符串,若 right 右移后指向的字符在哈希表中出现过,且最后出现的下标在 [left,right] 的范围内,说明此时的子串 [left,right] 已经出现了重复字符,此时 left 应该跳转到 s[right] 最后一次出现的位置的后面

下面的例子中, right 本来指向 f ,右移后指向 c , left 就要从 a 直接跳转到第一个 c 后面,否则 [left,right] 会出现重复字符。

(a b c d e f) c
a b c (d e f c)

每次 right 右移后,都要把 s[right] 及对应的下标 right 都存储到哈希表中,也就是把 s[right] 当前最后出现的位置存储到哈希表中。

// 方法二:滑动窗口优化
class Solution
{
public:int lengthOfLongestSubstring(string s){if (s.size() <= 1){return s.size();}unordered_map<char, int> um;int ans = 0;// [left,right] 表示子串int left = 0, right = 0;um[s[0]] = 0;// 右指针右移,直到出现重复字符while (++right < s.size()){auto it = um.find(s[right]);// 出现重复字符if (it != um.end()){// 左指针跳转到重复字符上一次出现的位置之后left = max(left, it->second + 1);}// 子串长度为 right-left+1ans = max(ans, right - left + 1);um[s[right]] = right;}return ans;}
};

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

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

相关文章

php PhpSpreadsheet 读取日期变数字问题解决

问题描述&#xff1a; 使用PhpSpreadsheet 读取表格数据&#xff0c;日期格式读取后变成数字&#xff0c;如下图&#xff1a; 解决方案&#xff1a; $cell $sheet->getCell(H . $row)->getValue(); $toTimestamp \PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimes…

腾轩科技传媒探讨网络整合营销推广的策略和效果

在当今高度信息化的商业环境中&#xff0c;整合营销推广&#xff08;IMC&#xff09;已经成为了品牌营销策略的核心。它旨在通过多种渠道和平台&#xff0c;将一致、连贯的品牌信息传达给目标受众&#xff0c;从而增强品牌知名度和忠诚度。腾轩科技传媒将深入探讨整合营销推广的…

【airtest】自动化入门教程(一)AirtestIDE

目录 一、下载与安装 1、下载 2、安装 3、打开软件 二、web自动化配置 1、配置chrome浏览器 2、窗口勾选selenium window 三、新建项目&#xff08;web&#xff09; 1、新建一个Airtest项目 2、初始化代码 3、打开一个网页 四、恢复默认布局 五、新建项目&#xf…

模拟算法题练习(一)

模拟算法介绍&#xff1a; 模拟算法通过模拟实际情况来解决问题&#xff0c;一般容易理解但是实现起来比较复杂&#xff0c;有很多需要注意的细节&#xff0c;或者是一些所谓很“麻模“的东西。 模拟题一般不涉及太难的算法&#xff0c;一般就是由较多的简单但是不好处理的部…

【算法】最小生成树—Prim算法与Kruskal算法

Prim算法和Kruskal算法都是解决最小生成树问题的经典算法。最小生成树是原图的最小连通子图&#xff0c;它包含原图的全部结点&#xff0c;且保持图连通的所有边代价和最小。一个连通图可能有多个最小生成树。 一、Prim算法 含义 Prim算法&#xff0c;也被称为普里姆算法&…

基于移动端的食堂助餐在线点餐配送系统 uniapp微信小程序

本文从管理员、老人、配送员、食堂商家的功能要求出发&#xff0c;养老助餐管理系统小程序中的功能模块主要是实现老人、配送员、食堂商家、食堂大厅、预约选座、餐号信息、美食信息、美食订单、订单信息、订单配送、订单评价、老人食堂、下单信息、饮食分析。经过认真细致的研…

C语言可以干些什么?C语言主要涉及哪些IT领域?

C语言可以干些什么&#xff1f;C语言主要涉及哪些IT领域&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家…

我在争什么?

本来想写一下2024项目部人员该怎么干&#xff0c;还没有写出来&#xff0c;大家内部就先动起来。针对现有情况做了分析&#xff1a; 作为项目人员&#xff08;实施&#xff0c;运维&#xff09; 需要有一定自我认识 认识清楚公司要什么&#xff1f; 认识清楚我自己要什么&…

内网安装redis+部署redis-cluster集群

一、安装redis redis安装包下载地址&#xff1a; https://download.redis.io/releases/ 1.1 解压编译并创建数据目录 tar xzvf redis-6.2.10.tar.gz -C /usr/local/ cd /usr/local/ mv redis-6.2.10/ redis cd /usr/local/redis/ make #编译 …

Springboot整合SSE实现实时消息推送

SSE详细介绍传送门&#xff1a;SSE实时消息推送 简单描述一下SSE推送在实际项目中应用的常见场景 1&#xff0c;项目页面中有消息通知板块&#xff0c;当信息有变化时&#xff0c;只有手动刷新页面&#xff0c;才会看到最新的数据&#xff0c;这里可以采用SSE技术实时推送最新…

Docker技术概论(1):Docker与虚拟化技术比较

Docker技术概论&#xff08;1&#xff09; Docker与虚拟化技术比较 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https:…

深入解析Android-AutoLayout,2024安卓开发面试题及答案

前言 如果你也学习Android&#xff0c;那么你大概率会看过我的文章。经常有读者给我留言&#xff1a;“该怎么学习Android&#xff1f;”、“日常学习Android的方法是什么”。 所以&#xff0c;今天&#xff0c;我将献上一份《Android知识图谱》&#xff0c;以自身的经验 &…

ABAP 发送带EXCEL邮件

前言 没啥特殊需求&#xff0c;就是有个库龄报表用户想整邮件发送 实现 用的最简单的XLS文件作为excel附件发送出去 观察XLS文件的纯文本格式&#xff0c;每列之间用TAB制表符分隔&#xff0c;每行之间用回车符分隔 思路也比较明确&#xff0c;在SAP中实现这种格式&#xf…

.Net利用Microsoft.Extensions.DependencyInjection配置依赖注入

一、概述 为了让接口程序更加模块化和可测试,采用依赖注入的方式调用接口方法。 二、安装Microsoft.Extensions.DependencyInjection 在NuGet里面搜索Microsoft.Extensions.DependencyInjection,并进行安装。 三、代码编写 3.1 创建Service 实现类 /*****************…

【跨境电商须知】FP独立站的特点和痛点有哪些?

无论是做独立站&#xff0c;还是做亚马逊&#xff0c;都有各自的难点。自己做独立站若要在跨境行业长足发展&#xff0c;既要知道FP独立站有什么特点&#xff0c;要清楚FP独立站的痛点并一一克服。 一、FP独立站的特点 与依赖第三方平台相比&#xff0c;拥有自己的域名、服务器…

Doccano 修复 spacy.gold 的bug

引言 最初只是想把Doccano标注的数据集转换成BIO(类似conll2003数据集)的标注格式&#xff1b; 摘要 可先阅读一下教程&#xff1a;【已解决】关于如何将Doccano标注的文本转换成NER模型可以直接处理的CoNLL 2003格式 装包:pip install doccano-transformer 报错信息 运行…

Adam优化算法

Adam算法&#xff08;Adaptive Moment Estimation&#xff09;是一种用于深度学习模型优化的算法&#xff0c;它结合了动量&#xff08;Momentum&#xff09;和RMSprop&#xff08;Root Mean Square Propagation&#xff09;的概念。Adam算法自2015年提出以来&#xff0c;因其高…

【前端素材】推荐优质后台管理系统DAdmin平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理网站、应用程序或系统的管理界面&#xff0c;通常由管理员和工作人员使用。它提供了访问和控制网站或应用程序后台功能的工具和界面&#xff0c;使其能够管理用户、内容、数据和其他各种功能。 2、功能需求 后台管理系…

FreeCAD|读取STEP、创建平面、相交、瓶子

FreeCAD是一个基于OpenCASCADE的开源CAD/CAE工具。OpenCASCADE是一套开源的CAD/CAM/CAE几何模型核心&#xff0c;来自法国Matra Datavision公司&#xff0c;是著名的CAD软件EUCLID的开发平台。FreeCAD可运行于Windows以及Linux系统环境下&#xff0c;是一种通用的3D CAD建模工具…

记录 关于navicat连接数据库报错1045的问题

重装数据库之后就连接不上了 报错1045 而网上的解决方案大都是更改数据库密码&#xff0c;但是我在第一步就被卡住无法更改密码&#xff0c;输入指令也报错&#xff0c;检查的环境变量也没错&#xff0c;经过长时间的试错终于找到解决了办法 解决办法 删除data文件夹 如果无法…