LeetCode刷题之HOT100之无重复字符的最长子串

今天搬工位了,研二的师兄师姐在这儿坐了半年,现在轮到我么们了。做题先

1、题目描述

在这里插入图片描述

2、逻辑分析

题目要求很明确,就是要找出无重复字符的最长。怎么求解呢?题解给出了滑动窗口的算法方案。

在这里插入图片描述
在这里插入图片描述

3、代码演示

public int lengthOfLongestSubstring(String s) {// 创建一个HashSet来存储已经出现过的字符,以便快速检查某个字符是否已经出现过 Set<Character> occ = new HashSet<Character>();// 获取字符串的长度int n = s.length();// 初始化右指针rk为-1,表示还未开始寻找子串 // ans存储最长子串的长度,初始化为0  int rk = -1 , ans = 0;// 遍历字符串的每一个字符  for(int i = 0; i < n; i++){// 如果i不是第一个字符(即i不等于0),则从HashSet中移除前一个字符,因为当前子串的起始位置已经后移了if(i != 0){occ.remove(s.charAt(i - 1));}// 使用while循环来扩展当前子串,直到遇到已经出现过的字符或者到达字符串的末尾// 如果当前字符不在HashSet中,说明可以添加到子串中,并且更新rkwhile(rk + 1 < n && !occ.contains(s.charAt(rk + 1))){occ.add(s.charAt(rk + 1));rk++;}// 更新最长子串的长度,取当前子串长度(rk - i + 1)和之前记录的最长子串长度ans的较大值ans = Math.max(ans , rk - i + 1);}// 返回最长子串的长度return ans;}

这段代码使用双指针(一个左指针i和一个右指针rk)和一个HashSet来解决问题。左指针 i 用于遍历字符串的每个字符,右指针 rk 用于扩展当前子串。每次移动左指针时,都会从HashSet中移除前一个字符,以确保当前子串不包含重复字符。然后,使用while循环来扩展当前子串,直到遇到重复字符或到达字符串的末尾。最后,更新最长子串的长度并返回。

我们可以使用字符串 “abcabcbb” 作为例子来详细解释上述代码的执行过程。字符串: “abcabcbb”

初始状态: occ (HashSet): 空集,n (字符串长度): 7,rk (右指针): -1,ans (最长子串长度): 0,i (左指针): 即将开始遍历。

步骤 1

(i = 0, rk = -1, ans = 0): occ.remove(s.charAt(i - 1)): 不执行(因为 i = 0)
while 循环: 将 ‘a’ 添加到 occ,rk 增加到 0
更新 ans: ans = Math.max(ans, rk - i + 1) = Math.max(0, 1) = 1

步骤 2

(i = 1, rk = 0, ans = 1): occ.remove(s.charAt(i - 1)): 移除 ‘a’
while 循环: 将 ‘b’ 添加到 occ, rk 增加到 1
更新 ans: ans = Math.max(ans, rk - i + 1) = Math.max(1, 2) = 2

步骤 3

(i = 2, rk = 1, ans = 2): occ.remove(s.charAt(i - 1)): 移除 ‘b’
while 循环: 将 ‘c’ 添加到 occ, rk 增加到 2
更新 ans: ans = Math.max(ans, rk - i + 1) = Math.max(2, 3) = 3

步骤 4

(i = 3, rk = 2, ans = 3): occ.remove(s.charAt(i - 1)): 移除 ‘c’
while 循环: !occ.contains(s.charAt(rk + 1)): 否(因为 ‘a’ 已经在 occ 中)
不执行添加和增加 rk
更新 ans: 保持为 3

步骤 5

(i = 4, rk = 2, ans = 3): occ.remove(s.charAt(i - 1)): 移除 ‘a’(这是之前 rk 指向的字符)
while 循环: rk + 1 < n: 是(因为 rk = 2), !occ.contains(s.charAt(rk + 1)): 是(因为 ‘b’ 不在 occ 中)
将 ‘b’ 添加到 occ , rk 增加到 3
更新 ans: ans = Math.max(ans, rk - i + 1) = Math.max(3, 2) = 3(长度没有增加)

接下来的步骤(i = 6,7,8)会按照类似的逻辑继续执行,但 ans 不会再增加,因为最长的无重复字符子串长度已经确定为 3。

滑动窗口思想需要好好消化,今天没睡好,晚上状态不好啊,睡眠太重要了,再见,朋友们!

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

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

相关文章

【管理咨询宝藏114】贝恩为某知名化妆品战略规划方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏114】贝恩为某知名化妆品战略…

【软件设计师】——8.结构化与数据流图

目录 8.1 结构化分析 8.2 结构化设计 8.3 数据流图DFD 8.4 数据字典 8.1 结构化分析 结构化分析是面向数据流进行需求分析的方法&#xff0c;采用结构化方法进行系统分析时&#xff0c;根据分解与抽象原则&#xff0c;按照系统中数据处理的流程&#xff0c;用&#xff08;数…

Hadoop大数的一些知识点分享给大家~~~~

查看zookeeper服务状态的命令是哪个&#xff1f; 要查看ZooKeeper服务的状态&#xff0c;可以使用zkServer.sh脚本的status命令。这个脚本通常位于ZooKeeper的安装目录的bin子目录中。以下是具体的命令&#xff1a; sh zkServer.sh status zkServer.sh status 当你运行这个命…

【Linux环境搭建实战手册】:打造高效开发空间的秘籍

文章目录 &#x1f680;Linux环境搭建&#x1f4a5;1. 设备要求❤️2. 了解虚拟机&#x1f680;3. 安装VMware&#x1f308;4. 终端基础信息解读 &#x1f680;Linux环境搭建 &#x1f4a5;1. 设备要求 处理器&#xff08;CPU&#xff09;&#xff1a;至少具有1 GHz的处理能力&…

微信小程序处理点击微信订阅消息通知到二级页面,右上角会出现到初始化页面

1.页面传参 正常跳转到详情页 wx.navigateTo({url: "/pages/use/OA/index/index",}) 订阅消息通知跳转到详情页 wx.reLaunch({url: /pages/use/OA/index/index?taptrue, }) 2.二级页面进行判断 // 获取路由参数&#xff0c;判断是否是订阅消息进来的 订阅消息进来…

VSCode中snippets(代码模板)的使用

首先安装Vue VSCode Snippets&#xff0c;在组件库中搜索并安装。 然后打开插件文件夹 文件夹名是 "作者名.vscode-插件名-版本号"组成的. C:\Users\Administrator\.vscode\extensions\sdras.vue-vscode-snippets-3.1.1\snippets 打开vue.json "prefix"…

JAVA面试题大全(十七)

1、redis 是什么&#xff1f;都有哪些使用场景&#xff1f; Redis是一个开源的&#xff0c;使用ANSI C语言编写&#xff0c;支持网络&#xff0c;可基于内存&#xff0c;可持久化的日志型&#xff0c;key-value数据库。 数据高并发的读写海量数据的读写对扩展性要求高的数据 …

【机器学习】SUTRA引领多语言处理

在人工智能的浪潮中&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术一直是备受瞩目的焦点。随着全球化和信息时代的到来&#xff0c;多语言处理能力成为了评估NLP技术优劣的重要标准。近期&#xff0c;一款名为SUTRA的多语言大型语言模型架构引起了业界的广泛关注。它…

【Linux】线程操作

文章目录 前言一、线程相关操作函数1. pthread_create2. pthread_join3. pthread_exit4. pthread_cancel5. pthread_detach6. 示例代码 前言 在 Linux 中并不存在真正意义上的线程, 而是通过复用进程的结构来实现的, 叫做轻量级进程. 线程是一个进程内部的一个执行流, 而一个进…

521源码-免费游戏源码下载-闯梦江湖Q萌复古全网通手游服务端H5全攻略

闯梦江湖H5&#xff1a;Q萌复古全网通手游服务端全攻略 一、概述 闯梦江湖H5 是一款结合Q萌画风与复古情怀的全网通H5手游。我们为您提供了最新打包的Windows服务端&#xff0c;并附带了通用视频架设教程和GM网页授权后台工具&#xff0c;让您轻松搭建并管理自己的游戏世界。 …

40、Flink 的窗口延迟数据处理(Allowed Lateness)详解

Allowed Lateness a&#xff09;概述 在使用 event-time 窗口时&#xff0c;数据可能会迟到&#xff0c;即 Flink 用来追踪 event-time 进展的 watermark 已经越过了窗口结束的 timestamp 后&#xff0c;数据才到达。 默认&#xff0c;watermark 一旦越过窗口结束的 timesta…

Kubernetes中的节点选择方法

在Kubernetes集群中&#xff0c;节点选择是一个重要的环节&#xff0c;它决定了Pod将被调度到哪个节点上运行。Kubernetes提供了多种节点选择的方法&#xff0c;以满足不同的部署需求和资源优化。本文将介绍Kubernetes中的几种节点选择方法&#xff0c;并附带相关代码示例。 目…

为什么SQL执行计划未使用创建的索引呢?MySQL是如何选择索引的?

在实际工作中,大家可能会遇到这个问题:MySQL并没有按照自己的预想来选择索引,比如创建了索引但是选择了全表扫描,这肯定是 MySQL 数据库的 Bug,或者是索引出错了。真相真的是MySQL出错了吗?当然不是。主要是因为索引中的数据出了错。 为什么这么说呢?要理解这个问题,要…

python技巧梳理

背景 在开发中&#xff0c;经常会遇到&#xff0c;同时存在多个值&#xff0c;依次判断上述值&#xff0c;选择第一个非空、True的值作为整个表达式的值进行返回&#xff0c;这个时候会用到or这个关键词&#xff0c;下面讲一下用法。 方法 value1 None value2 0 value3 H…

斯洛文尼亚普利雅玛城堡:吉尼斯世界纪录认证的世界最大溶洞城堡

除了著名的波斯托伊纳溶洞&#xff08;Postojna Cave&#xff09;&#xff0c;普利雅玛城堡&#xff08;Predjama Castle&#xff09;也是波斯托伊纳洞穴公园&#xff08;Postojna Cave Park&#xff09;不容错过的景点之一。这座城堡坐落在斯洛文尼亚&#xff08;Slovenia&…

什么是数字化转型?企业数字化转型的核心重点有哪些?

一、什么才是真正的数字化转型&#xff1f; 虽然很多企业管理者已经就企业数字化逐步达成了较为广泛的共识&#xff0c;但根据业界的调查结论&#xff0c;不少企业管理者仍然缺乏紧迫感和行动力&#xff0c;反应迟缓。 导致这些情况的本质原因&#xff1a;主要还是因为企业管…

【编译原理】LR(0)分析

一、实验目的 LR(0)分析法是一种移进归约过程&#xff0c;能根据当前分析栈中的符号串&#xff0c;同时也不用向右查看输入串的符号就可唯一确定分析器的动作。通过对给定的文法构造LR(0)分析表和实现某个符号串的分析掌握LR(0)分析法的基本思想。 二、实验要求 实现LR(0)分…

用(华为)三层交换技术解决不同vlan间通信问题

用三层交换技术解决不同vlan间通信问题 一、网络拓扑&#xff1a; 二、配置思路&#xff1a;自下而上配置 1.PC端配置基本IP信息包括网关 2.接入交换机S1上划分三个vlan&#xff0c;分别是VLAN 10 VLAN 20 VLAN 30 并且将对应的接口加入指定的vlan 3.给接入交换机配置trunk链路…

IT技术 | 电脑蓝屏修复记录DRIVER_IRQL_NOT_LESS_OR_EQUAL

我的台式机是iMac 2015年的&#xff0c;硬盘是机械的&#xff0c;时间久了运行越来越慢。后来对苹果系统失去了兴趣&#xff0c;想换回windows&#xff0c;且想换固态硬盘&#xff0c;就使用winToGo 搞了双系统&#xff0c;在USB外接移动固态硬盘上安装了win10系统。 最近&…

SpringBoot 配置全局异常统一处理

【1】创建全局异常的类 BusinessException Slf4j public class BusinessException extends RuntimeException {/*** 错误码*/private int code;public int getCode() {return code;}/*** param message*/public BusinessException(String message) {super(message);this.code …