news 2026/5/31 22:41:15

10.滑动窗口解决:无重复字符的最长子串 | LeetCode 3 Java 题解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
10.滑动窗口解决:无重复字符的最长子串 | LeetCode 3 Java 题解

目录

一、题目解析

示例 1:

示例 2:

示例 3:

二、算法原理

解法一:暴力枚举 + 哈希表(O(n²))

解法二:滑动窗口(推荐!O(n))

滑动窗口的核心步骤:

三、编写代码(Java)

for循环写法(推荐!!!)

while循环写法

四、总结


OJ链接:无重复字符的最长子串

哈喽大家好!今天咱们来啃一道经典的算法题——无重复字符的最长子串。这道题在 LeetCode 上是第 3 题,难度中等,但绝对是必练的滑动窗口入门题!


一、题目解析

先看题目描述:

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

注意关键词:子串(必须是连续的!)和无重复字符

示例 1:

  • 输入:s = "abcabcbb"

  • 输出:3

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

示例 2:

  • 输入:s = "bbbbb"

  • 输出:1

  • 解释:因为无重复字符的最长子串是"b",所以长度为 1。

示例 3:

  • 输入:s = "pwwkew"

  • 输出:3

  • 解释:因为无重复字符的最长子串是"wke",所以长度为 3。(注意"pwke"是子序列,不是子串!)

📌小贴士:子串 vs 子数组 → 都是连续的一段!别被“子序列”带偏了!


二、算法原理

这道题有几种解法,我们重点讲两种:

解法一:暴力枚举 + 哈希表(O(n²))

  • 枚举所有子串,用哈希表判断是否有重复字符。

  • 时间复杂度高,不推荐,但可以作为理解题意的起点。

解法二:滑动窗口(推荐!O(n))

  • 利用“窗口”思想,维护一个无重复字符的连续区间

  • 用两个指针leftright表示窗口左右边界。

  • 用一个数组(或哈希表)记录每个字符出现的次数。

滑动窗口的核心步骤:

  1. 初始化left = 0,right = 0

  2. 进窗口:让s[right]进入窗口 →hash[s[right]]++

  3. 判断:如果hash[s[right]] > 1→ 说明有重复!

  4. 出窗口:从左边开始删,直到重复字符被移除 →hash[s[left++]]--

  5. 更新结果ret = Math.max(ret, right - left + 1)

  6. 移动右指针right++

关键点:窗口内始终是无重复字符的!一旦重复,就收缩左边界,直到恢复无重复状态。


三、编写代码(Java)

我整理了两种写法,for循环写法更推荐(结构清晰,易读),也保留了while循环写法,方便你对比学习。

for循环写法(推荐!!!)

class Solution { public int lengthOfLongestSubstring(String ss) { // 先转换为字符数组 char[] s = ss.toCharArray(); // 数组模拟哈希表存储每个字符出现的次数 // 也是滑动窗口需要维护的数据 int hash[] = new int[128]; int n = ss.length(); int len = 0; for(int left = 0, right = 0; right < n; right++) { // 入窗口 hash[s[right]]++; // 判断 while(hash[s[right]] > 1) { // 出窗口 hash[s[left++]]--; } // 更新结果 len = Math.max(len, right - left + 1); } return len; } }

while循环写法

class Solution { public int lengthOfLongestSubstring(String ss) { char[] s = ss.toCharArray(); int[] hash = new int[128]; int left = 0, right = 0; int ret = 0; int n = ss.length(); while (right < n) { // 入窗口 hash[s[right]]++; // 判断 while (hash[s[right]] > 1) { // 出窗口 hash[s[left++]]--; } // 更新结果 ret = Math.max(ret, right - left + 1); // 让下一个字符进入窗口 right++; } return ret; } }

四、总结

这道题是滑动窗口的经典入门题,核心是:

  • 用双指针维护窗口

  • 用数组/哈希表记录字符频次

  • 遇到重复就收缩左边界

  • 每次更新最大长度

时间复杂度:O(n)

空间复杂度:O(1)(因为字符集固定128)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 12:55:13

AI驱动客户服务转型:从成本中心到价值引擎的战略实践

1. 项目概述&#xff1a;当客户服务遇见AI&#xff0c;一场静默的变革如果你还在把客户服务看作是一个成本中心&#xff0c;一个由人工坐席接听电话、回复邮件的传统部门&#xff0c;那么你可能已经站在了被淘汰的边缘。这不是危言耸听&#xff0c;而是正在发生的现实。我过去十…

作者头像 李华
网站建设 2026/5/29 12:55:00

从零打造8x8x8 LED立方体:多路复用原理、74HC595驱动与三维动画编程全解析

1. 项目概述与核心价值如果你对电子制作和微控制器编程感兴趣&#xff0c;并且一直想挑战一个既壮观又能学到硬核知识的项目&#xff0c;那么亲手打造一个8x8x8的LED立方体绝对是个里程碑式的选择。这个项目不仅仅是点亮512个发光二极管那么简单&#xff0c;它是一次对耐心、精…

作者头像 李华
网站建设 2026/5/29 12:53:08

如何关闭Chrome中Google搜索的AI概览功能:四种方法详解

1. 项目概述&#xff1a;为什么我们需要关闭搜索结果的AI概览如果你最近在使用Chrome浏览器进行Google搜索&#xff0c;可能会发现搜索结果页面的顶部多出了一个名为“AI概览”的板块。这个功能是Google将生成式AI深度整合进搜索引擎的产物&#xff0c;它会尝试用一段AI生成的摘…

作者头像 李华
网站建设 2026/5/29 12:50:22

企业级大模型选型倒计时:Claude、GPT-4.5、GLM-4v、DeepSeek-R1、Llama-3.2-90B——谁能在私有化部署、审计日志、国产信创适配三重关卡存活?

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;企业级大模型选型倒计时&#xff1a;Claude竞品分析报告 在企业级AI基础设施加速落地的背景下&#xff0c;大模型选型已进入关键决策窗口期。Claude系列&#xff08;尤其是Claude 3 Opus/Sonnet&#xff09;凭…

作者头像 李华
网站建设 2026/5/29 12:50:21

一键解决Windows软件运行难题:VisualCppRedist AIO完整指南

一键解决Windows软件运行难题&#xff1a;VisualCppRedist AIO完整指南 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过游戏无法启动、办公软件…

作者头像 李华