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;数…

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

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

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

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

【机器学习】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;让您轻松搭建并管理自己的游戏世界。 …

Kubernetes中的节点选择方法

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

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&…

【编译原理】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系统。 最近&…

C++ 虚函数和纯虚函数

虚函数 #include <iostream> using namespace std; class Vehicle //交通工具 { public:void run() const{cout << "run a vehicle. " << endl;} }; class Car : public Vehicle //汽车 { public:void run() const{cout << "run a c…

Android studio版本和Android gradle plugin版本对应表

1.Android studio 版本的升级&#xff0c;一个方面上看主要是升级对AGP最高版本的支持 2.那为什么AGP要出高版本呢&#xff0c;主要支持高版本的API&#xff0c;真是一环扣一环

将YOLO格式数据集转换为YOLO-Mamba等特定工具指定的数据集格式

目录 克隆Github YOLO-Mamba源码YOLO-Mamba数据集格式下载的公开数据集目录边界框坐标文件类别标签文件 数据集格式转换代码转换格式的效果展示 今天为大家解析YOLO-Mamba这篇论文开源的代码&#xff0c;首先讲解YOLO格式数据集转换为YOLO-Mamba等特定工具指定的数据集格式的操…

GoogLeNet论文解读—Going deeper with convolutions2015(V1)

GoogLeNet论文解读—Going deeper with convolutions2015 说明&#xff1a;本文只解读GooleNet的14年参赛的v1版本&#xff0c;之后的改进版本可能在日后的学习中继续更新 研究背景 更深的卷积神经网络 认识数据集&#xff1a;ImageNet的大规模图像识别挑战赛 LSVRC-2014&…

Java面试八股之Thread类中的yeild方法有什么作用

Thread类中的yeild方法有什么作用 谦让机制&#xff1a;Thread.yield()方法主要用于实现线程间的礼让或谦让机制。当某个线程执行到yield()方法时&#xff0c;它会主动放弃当前已获得的CPU执行权&#xff0c;从运行状态&#xff08;Running&#xff09;转变为可运行状态&#…

快速失败“fail-fast”和安全失败“fail-safe”

目录 快速失败——fail-fast 异常原因 正常原因 安全失败“fail-safe” 快速失败——fail-fast java的快速失败机制是java集合框架中的一种错误检测机制&#xff0c;当多个线程对集合中的内容进行修改时可能就会抛出ConcurrentModificationException异常。不仅仅在多线程状态…