【LeetCode Hot100】无重复字符的最长子串 ,滑动窗口+哈希表,Java实现!图解+代码,小白也能秒懂!

滑动窗口算法解析:无重复字符最长子串的优化实现 滑动窗口算法是处理字符串和数组子区间问题的核心技巧,通过维护动态的窗口边界来高效解决问题。其基本原理是使用双指针定义窗口的起始和结束位置,根据特定条件调整指针移动,从而在O(n)时间复杂度内完成搜索。在字符串处理领域,滑动窗口技术能够有效解决最长无重复子串、最小覆盖子串等经典问题,显著提升算法效率。以LeetCode HOT100中的无重复字符最长子串为例,该题目要求找出字符串中不包含重复字符的最长子串长度。通过哈希表记录字符位置结合滑动窗口优化,可以将暴力解法的O(n³)复杂度降至O(n),体现了算法优化 阅读详情

💻 [LeetCode Hot100] 无重复字符的最长子串 ,滑动窗口+哈希表,Java实现!图解+代码,小白也能秒懂!

✏️本文对应题目链接:无重复字符的最长子串


📌 题目描述

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

示例:

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

🧠 解题思路(图文分解)

❗ 核心难点

如何高效找到不含重复字符的最长子串?


方法一:滑动窗口 + 哈希表(黄金思路)✨

关键步骤:

  1. 初始化:
    • 使用哈希表记录字符最后一次出现的位置
    • 定义滑动窗口的左右边界 left 和 right
  2. 遍历字符串:
    • 如果当前字符已存在于哈希表,并且其位置在 left 右侧,则更新 left 到重复字符的下一个位置
    • 更新当前字符在哈希表中的位置
    • 计算当前窗口长度,并更新最大值
  3. 返回结果:最长子串的长度

图解滑动窗口

输入字符串:

s = "abcabcbb"

步骤1:初始化

left = 0, right = 0
maxLen = 0
哈希表:{}

步骤2:遍历字符串

right=0: 字符'a' → 哈希表={'a':0} → 窗口长度=1 → maxLen=1
right=1: 字符'b' → 哈希表={'a':0, 'b':1} → 窗口长度=2 → maxLen=2
right=2: 字符'c' → 哈希表={'a':0, 'b':1, 'c':2} → 窗口长度=3 → maxLen=3
right=3: 字符'a' → 'a'已存在,且位置0 >= left → 更新left=1 → 哈希表={'a':3, 'b':1, 'c':2} → 窗口长度=3 → maxLen=3
right=4: 字符'b' → 'b'已存在,且位置1 >= left → 更新left=2 → 哈希表={'a':3, 'b':4, 'c':2} → 窗口长度=3 → maxLen=3
right=5: 字符'c' → 'c'已存在,且位置2 >= left → 更新left=3 → 哈希表={'a':3, 'b':4, 'c':5} → 窗口长度=3 → maxLen=3
right=6: 字符'b' → 'b'已存在,且位置4 >= left → 更新left=5 → 哈希表={'a':3, 'b':6, 'c':5} → 窗口长度=2 → maxLen=3
right=7: 字符'b' → 'b'已存在,且位置6 >= left → 更新left=7 → 哈希表={'a':3, 'b':7, 'c':5} → 窗口长度=1 → maxLen=3

最终结果:

maxLen = 3

🚀 代码实现

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if (s == null || s.length() == 0) {
            return 0;
        }

        // 哈希表记录字符最后一次出现的位置
        Map<Character, Integer> map = new HashMap<>();
        int maxLen = 0; // 最长子串的长度
        int left = 0; // 滑动窗口的左边界

        // 遍历字符串
        for (int right = 0; right < s.length(); right++) {
            char currentChar = s.charAt(right);
            // 如果字符已存在,并且位置在left右侧,则更新left
            if (map.containsKey(currentChar) {
                left = Math.max(left, map.get(currentChar) + 1);
            }
            // 更新字符的位置
            map.put(currentChar, right);
            // 计算当前窗口长度,并更新最大值
            maxLen = Math.max(maxLen, right - left + 1);
        }

        return maxLen;
    }
}

💡 复杂度分析

  • 时间复杂度:O(n) → 只需遍历字符串一次
  • 空间复杂度:O(min(m, n)) → 哈希表存储字符,m 为字符集大小

方法二:滑动窗口 + 数组(优化空间复杂度)

关键思路:用数组代替哈希表,适用于字符集较小的情况(如ASCII字符)。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int[] lastIndex = new int[128]; // ASCII字符集
        Arrays.fill(lastIndex, -1); // 初始化数组
        int maxLen = 0;
        int left = 0;

        for (int right = 0; right < s.length(); right++) {
            char currentChar = s.charAt(right);
            // 如果字符已存在,并且位置在left右侧,则更新left
            if (lastIndex[currentChar] >= left) {
                left = lastIndex[currentChar] + 1;
            }
            // 更新字符的位置
            lastIndex[currentChar] = right;
            // 计算当前窗口长度,并更新最大值
            maxLen = Math.max(maxLen, right - left + 1);
        }

        return maxLen;
    }
}

🌟 总结要点

✅ 滑动窗口核心思想:动态维护无重复字符的子串
✅ 哈希表/数组作用:快速定位字符的最后出现位置
✅ 适用场景:字符串匹配、子串问题


LeetCode hot 100 解题思路记录(一) 重叠是则更新列表最后一个区间的右边界,取两者最大值否则直接添加到结果列表返回结果列表。 阅读详情

相关推荐

hMailServer安装配置

hMailServer安装配置 使用宝塔面板上的宝塔邮件服务器2.1版本,进行安装hMailServer。 宝塔在安装hMailServer是有做了一些配置,如果是手工安装需要注意一下配置点: 1、\hMailServer\Bin 目录下增加mysql连接文件libmysql.dll,要去下载32位的。 libmysql.dll下载 链接:https://pan.baidu.com/s/1YGJXzjowlJ9n_MiqB4xiqw 提取码:wz90 2、 需要提前安装mysql,并创建hM.

王者的博客 5866

滑动窗口算法解析:无重复字符最长子串的O(n)解法

滑动窗口算法是一种处理数组或字符串子区间问题的高效技术,其核心原理是通过双指针动态维护一个连续区间,避免重复计算来优化时间复杂度。在字符串处理领域,该算法能够将暴力解法的O(n³)复杂度优化到O(n),显著提升性能。其技术价值在于为子串匹配、数据流分析等场景提供了通用解决方案,特别适用于需要实时处理连续数据的应用场景。以LeetCode HOT100中的经典题目'无重复字符的最长子串'为例,该问题通过哈希表记录字符位置,结合滑动窗口的边界调整机制,实现了高效的去重统计。这种算法思想在面试准备和工程实践中都具

weixin_34175509的博客 376

FPGA数字信号处理中定点数的舍入与饱和硬件实现详解

在数字信号处理(DSP)的硬件实现中,定点数运算是核心基础。由于硬件资源(如FPGA的DSP Slice)的位宽有限,连续的乘加运算会导致数据位宽膨胀,严重影响时序和资源利用率。为解决此问题,必须引入舍入(Rounding)和饱和(Saturation)机制。舍入通过对低位进行四舍五入,在可控的精度损失下缩减位宽;饱和则作为动态范围的守护者,防止数据溢出导致信号环绕失真,确保系统行为确定。这两种技术是算法在有限精度硬件上正确、高效运行的关键,广泛应用于滤波器、FFT等DSP模块以及通信、音频处理等场景。本文

weixin_30954817的博客 247

LeetCode-T3-无重复字符的最长子串

问题描述 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。 例子 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke"是一个子序列,...

sunny520baby的博客 203

多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解

多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解 1. 概览 在开始具体讨论卡尔曼滤波和匈牙利算法之前,首先我们来看一下基于检测的目标跟踪算法的大致流程。 2. 卡尔曼滤波(Kalman filter) 目标跟踪中使用的就是最基础的 Kalman filter 算法。这里也仅仅讨论最基础的 Kalman filter 算法。 卡尔曼滤波算法的过程很简单,如下图所示。最核心的两个步骤就是预测和更新(下图的 correct)。 在目标跟踪任务中,目标的

生命在于折腾! 2万+

Oracle 11g安装教程(保姆级超详细安装教程)

Oracle详细安装步骤,每一步都配有图例引导 ORACLE是数据库(Oracle服务端)。是连接数据库的客户端(Oracle客户端)。是连接oracle的可视化客户端软件。

2302_81846649的博客 1万+

LeetCode刷题全攻略:从零基础到进阶的系统化方法与实战案例

算法与数据结构是计算机科学的核心基础,其原理在于通过特定的数据组织方式和计算步骤,高效解决复杂问题。掌握这些基础能显著提升开发者的逻辑思维、问题分解与编码实现能力,对于构建高性能软件、优化系统资源至关重要。在工程实践中,算法能力是技术面试的核心考察点,尤其在互联网大厂的招聘中,LeetCode平台已成为衡量候选人技术水平的重要标尺。通过系统性的刷题训练,开发者不仅能巩固如**双指针**、**动态规划**等关键技术概念,还能熟悉面试常见题型与思维模式,从而在求职或技能提升场景中脱颖而出。本文聚焦于提供一套可复

anjichan4261的博客 374

【ChatGPT】实用 Prompt 指令大全 —— 一文教你如何更好地挖掘 GPT 的价值

ChatGPT 是由 OpenAI 开发的一种先进的大型语言生成模型,能够理解和生成准确、自然且连贯的文本。文本生成数据分析内容审核语义理解自然语言推理以及其他众多任务ChatGPT是一种基于GPT-3.5架构的大型语言模型,由OpenAI公司开发。该模型在自然语言处理领域有着广泛的应用,可以用于文本生成、文本分类、情感分析、问答系统等任务。本文将从模型的架构、训练方式、优缺点等方面对ChatGPT进行详细介绍。一、模型架构。

AI天才研究院 2万+

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 365

7.29华为OD机试真题 新系统 - 能量对撞 (Java/Py/C/C++/Js/Go)

7.29华为OD机试真题 新系统 - 能量对撞 (Java/Py/C/C++/Js/Go)

算法大师! 1318

Mac mini M2 部署 OpenClaw:最稳 7×24 本地 AI 服务器

Mac mini M2 凭借其强大的 M2 芯片、低功耗和静音特性,成为部署 OpenClaw AI 服务器的理想平台。本文详细介绍了从系统配置到 OpenClaw 部署的全过程,包括 Docker 环境搭建、docker-compose 编排、性能优化方案以及开机自启设置。通过统一内存架构和高效 SSD,M2 版 Mac mini 在 AI 推理速度上显著优于前代产品,同时保持极低的功耗(仅 8W),适合 7×24 小时稳定运行。部署方案充分利用了容器化技术,确保了服务的可靠性和可维护性。

一键难忘的博客 2953

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等) 题目描述: 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: - s = s1 + s2 + ... + sn - t = t1 + t2 + ... + tm - |n - m| <= 1 - 交错 是 s1 + t

huayimenghan的博客 207

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LeetCode 每日一题 2026/11/2-2026/11/8

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步

AlphaTao的博客 175

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Hash表:两数之和、字母异位词分组、最长连续序列 [力扣 Hot100]

三道高频哈希表应用题:两数之和(利用HashMap快速查找补数)、字母异位词分组(排序后作为键分组)、最长连续序列(通过HashSet去重并仅从序列起点扩展)。核心思想均为借助哈希结构优化查找效率,避免重复计算。同时提及双指针等其他解法思路,体现算法设计中“空间换时间”的典型策略。

2403_87560480的博客 218

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

力扣73 矩阵置零

该解法通过标记含0的行和列来实现矩阵置零。遍历矩阵,用布尔数组记录有0的行和列;再遍历一次,若当前行或列被标记,则置为0。时间复杂度O(mn),空间复杂度O(m+n)。

Pniubi的博客 22

LeetCode Hot 100 二叉树专题(三):BST 二叉搜索树与右视图(Java)

本专题主线:三题(98 / 230 / 199)共用两把钥匙——BST 的中序序列严格递增,以及遍历中的"层"与"深度"标记。看懂这两点,三题共用一套模板。 结构约定:每题统一分三部分——①题目分析与解题思路(含易错点辨析);②常见解法(附代码)及讲解;③知识点总结。

2401_88612756的博客 590

LeetCode 3926. 统计有效单词的出现次数【分组循环】

核心思想:用分组循环,一趟遍历字符串,把一个个单词切出来,丢进哈希表统计频次。,先把所有片段拼接成完整文本字符串。,依次返回每个单词在文本里的出现次数。难点:内层循环的判断条件,区分。

2503_92676540的博客 170

力扣第526场周赛心得理解

思路:因为题目要求尽可能求出最小的最大值,而满足要求最小公约数为2,作为题目要求最小的最大值,先去求出它的最大公约数再通过value判断最左边是否大于0,以及value本身是否大于0,而index的位置只能为中间或者最右边,所以最后输出只能是value本身或者在这个基础上加相隔相应距离次数的结果。两个整数,是指将第二个整数的所有十进制数位拼接在第一个整数的所有十进制数位之后。如果不存在这样的数组,返回 -1。4097. 合并整数后的最小值。返回所有合并后得到的整数中的。合并,依此类推,直到将。

目前主攻编程,目标是把屏幕上的红波浪线变成流畅运行的程序♪(^∀^●)ノシ 205

【算法学习笔记】LeetCode 15:三数之和(排序 + 双指针)

使用sort()对数组进行排序。理解排序后双指针的移动原理。使用外层循环固定一个数字。使用左右指针寻找另外两个数字。使用continue和while实现去重。理解的执行逻辑。将三层循环优化为排序 + 双指针,使时间复杂度从 O(n³) 降低到 O(n²)。

aqiu111111的博客 158

LeetCode hot 100 — 226. 翻转二叉树 | 101. 对称二叉树

自己稀里糊涂写了一版本居然还对了,我觉得我的思想就是很简单,这里就是要交换每一个节点的左右子树,所以套用了一下之前的中序遍历的迭代套路。一直在return False,但是没有给真正的正确答案一个出口(注意递归调用中出口 / 返回值很重要,或者说是最重要的)差一步美满....用的递归的写法,差一点点就满分了,先给出自己最开始写的代码。这道题的本质是对每一个节点执行相同的操作,并且交换哪个节点在先并不重要。你可以运用递归和迭代两种方法解决这个问题吗?,翻转这棵二叉树,并返回其根节点。给你一个二叉树的根节点。

Canmido的博客 134

LeetCode100 15. 三数之和

本题通过排序+双指针优化三数之和。先对数组排序,外层遍历固定第一个数,内层用左右指针查找另两个数,使三数之和为0。通过剪枝(当前数>0则终止)和去重(跳过重复元素)提升效率。相比暴力或哈希法,该方法时间复杂度为O(n²),空间O(1),更高效优雅。

Shaoxingzong的博客 323

力扣3无重复字符的最长字串(滑动窗口)

该题使用滑动窗口+哈希集合优化,通过复用Set实现O(n)时间复杂度。若每轮循环都新建HashSet,虽逻辑正确,但需重复插入删除,退化为O(n²),导致超时。原解法利用窗口右移时仅移除左端旧字符、扩展右边界,避免重复操作,实现高效遍历。

Pniubi的博客 230

LeetCode 11 - 20

LeetCode 题库 11 - 20

djhws144的博客 235

LeetCodehot100+背包问题+虚拟线程

虚拟线程虽能高效利用CPU,但滥用会导致资源耗尽。错误用法中,瞬间创建1万个虚拟线程并发调用慢速下游服务,虽不占用物理线程,却引发网络连接、内存和下游服务的全面崩溃。根本原因在于虚拟线程仅缓解“等待”成本,未解决“资源”瓶颈。正确做法是在IO边界使用Semaphore限流,如设为100,控制并发数,使多余请求在堆内存中廉价挂起,保护系统稳定。虚拟线程需配合背压机制,才能真正发挥其高并发优势。

记录大学学习学习成长过程,欢迎各位一起交流 419
上一篇: 【LeetCode Hot100】接雨水 动态规划 vs 双指针,Java实现!图解+代码,小白也能秒懂!
下一篇: 【LeetCode Hot100】找到字符串中所有字母异位词 ,滑动窗口+数组,Java实现!图解+代码,小白也能秒懂!
AllowM
博客等级 码龄7年 111粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值