前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【LeetCode 热题 100】3.无重复字符的最长子串:详解滑动窗口解法

【LeetCode 热题 100】3.无重复字符的最长子串:详解滑动窗口解法

作者头像
未名编程
发布于 2025-05-02 13:20:46
发布于 2025-05-02 13:20:46
16500
代码可运行
举报
文章被收录于专栏:PythonPython
运行总次数:0
代码可运行

📌 原题链接:Longest Substring Without Repeating Characters

📖 一、题目描述

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

示例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: s = "abcabcbb"
输出: 3
解释: 最长不重复子串是 "abc",长度为 3

🧠 二、解题思路:滑动窗口 + 哈希集合

这是一道非常典型的滑动窗口问题。

✅ 为什么用滑动窗口?

如果我们使用暴力解法去尝试所有子串,时间复杂度会高达 O(n²)。 我们可以通过维护一个“不含重复字符的子串窗口”来动态处理:

  • 使用两个指针 leftright 表示当前窗口的左右边界。
  • 用一个集合 set() 来记录窗口内已经出现的字符。
  • 如果出现重复,就移动左指针(收缩窗口);否则右移右指针(扩展窗口)。
  • 每次更新窗口时记录最大长度。

💻 三、Python 解法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        char_set = set()
        left = 0
        max_len = 0

        for right in range(len(s)):
            while s[right] in char_set:
                char_set.remove(s[left])
                left += 1
            char_set.add(s[right])
            max_len = max(max_len, right - left + 1)

        return max_len

🔍 四、关键语句逐行解释

class Solution:

定义一个类,这在 LeetCode 是默认要求的格式,系统会自动调用类中的方法。

def lengthOfLongestSubstring(self, s: str) -> int:

函数签名,表示接受一个字符串类型的参数 s,返回一个整数类型。 其中:

  • s: str 是类型注解,说明参数是字符串
  • -> int 是返回类型注解,表示返回整数
char_set = set()

创建一个空的集合,用于记录当前窗口中的字符。

🧠 Python 中 set 的特点:
  • 不重复:集合不能包含重复元素
  • 无序:元素没有顺序
  • 查找速度快:查找、添加、删除操作平均时间复杂度为 O(1)
while s[right] in char_set:

说明当前字符已经在窗口中了 → 出现重复 我们就不断从左边移除字符,直到窗口合法为止。

left += 1

left = left + 1 的简写,表示左指针向右移动一格(窗口缩小)


🧪 五、图解演示:以 “abcabcbb” 为例

  1. 初始窗口为空:""
  2. 扩展右边界,加入 "a" → "ab" → "abc",窗口合法。
  3. 遇到下一个 "a",重复!此时不断移动左指针直到重复字符移出。
  4. 整个过程中记录窗口长度,得到最大值为 3

你可以理解为“窗口在滑动”,但窗口内始终保持“无重复”的条件。


📈 六、复杂度分析

项目

分析

时间复杂度

O(n),每个字符最多进入和移除一次

空间复杂度

O(min(n, m)),m 为字符集大小,如 ASCII 为 128


🧩 七、常见问题答疑

self 是什么?
  • 在类的方法中,第一个参数必须是 self,代表“这个对象自身”。
  • 调用时系统自动传入,不需要你自己写。
❓ 为什么用 set() 而不是 list
  • set 查找是否包含某元素的效率是 O(1),list 是 O(n)
  • 用集合可以快速判断重复字符并删除,效率更高
❓ 如果我直接写一个函数不加 class 可以吗?
  • 在 LeetCode 上不行,它要求你写在类里
  • 在本地写是可以的,函数形式更自由

✅ 八、简洁版本(非类形式,供本地测试)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def length_of_longest_substring(s: str) -> int:
    char_set = set()
    left = 0
    max_len = 0

    for right in range(len(s)):
        while s[right] in char_set:
            char_set.remove(s[left])
            left += 1
        char_set.add(s[right])
        max_len = max(max_len, right - left + 1)

    return max_len

🏁 九、总结

技术点

说明

滑动窗口

用两个指针控制当前区间

集合 set()

用于存储并快速查找重复字符

双指针

控制窗口动态扩展与收缩

类型注解

增强代码可读性,利于调试


✨ 十、后记

这道题是滑动窗口入门题,非常适合用来掌握双指针、集合操作、条件判断等核心编程思想。

🎯 掌握它后,你可以挑战更多类似问题,如:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Kibana(一张图片胜过千万行日志)
Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起工作。
java架构师
2019/01/03
2.5K0
ELK总结——第四篇Kibana的简介
Kibana 是为 Elasticsearch设计的开源分析和可视化平台。你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互。你可以很容易实现高级的数据分析和可视化,以图标的形式展现出来。
胡齐
2019/12/19
3.8K0
ELK总结——第四篇Kibana的简介
如何开发自己的搜索帝国之ES图形化Kibana安装与使用
  在如何开发自己的搜索帝国之Elasticsearch中已经介绍安装好了ES,下面就Kibana对ES的查询监控作介绍,就是常提到的大数据日志处理组件ELK里的K。   什么是Kibana?现引用园
欢醉
2018/01/22
1.8K0
如何开发自己的搜索帝国之ES图形化Kibana安装与使用
Elasticsearch系列组件:Kibana无缝集成的数据可视化和探索平台
Kibana 是一个开源的数据分析和可视化平台,它是 Elastic Stack(包括 Elasticsearch、Logstash、Kibana 和 Beats)的一部分,主要用于对 Elasticsearch 中的数据进行搜索、查看、交互操作。
栗筝i
2023/10/16
4.1K0
Elasticsearch系列组件:Kibana无缝集成的数据可视化和探索平台
腾讯云 Elasticsearch 运维篇(十四)可视化工具Kibana
在前面的章节中,我们快速搭建了基于腾讯云ES的集群,也通过了多种方式去访问管理ES集群。那么在数据接入到腾讯云ES后,我们就需要对存入ES的数据进行分析、探索,以图标的形式展现出来,进而实现高级的数据分析和可视化工作。那么我们来讲一下腾讯云Kibana的相关操作吧
南非骆驼说大数据
2020/02/23
4K1
Asp.NET Core 如何使用ElasticSearch和Kibana创建仪表板
在我以前的文章(这里是第一[1]篇和第二篇[2])中,我展示了ElasticSearch作为电子商务中的全文搜索引擎的使用,一些高级配置的设置和使用以及products包含所有内容的索引的创建保存的产品。
郑子铭
2021/11/10
1.6K0
Asp.NET Core 如何使用ElasticSearch和Kibana创建仪表板
【ES三周年】高效搜索引擎ElasticSearch介绍
官网:https://www.elastic.co/cn/products/elasticsearch
4O4
2023/02/17
2.4K14
【ES三周年】高效搜索引擎ElasticSearch介绍
使用ELK Stack进行日志管理和分析:从入门到精通
在现代IT运维中,日志管理和分析是确保系统稳定性和性能的关键环节。ELK Stack(Elasticsearch, Logstash, Kibana)是一个强大的开源工具集,广泛用于日志收集、存储、分析和可视化。本文将详细介绍如何使用ELK Stack进行日志管理和分析,帮助您从入门到精通。
Echo_Wish
2024/09/25
2750
使用ELK Stack进行日志管理和分析:从入门到精通
Kibana 是一个开源的数据可视化工具
Kibana 是一个开源的数据可视化工具,专为 Elasticsearch 设计,用于搜索、查看和分析存储在 Elasticsearch 中的数据。它提供丰富的图表、表格和地图功能,支持日志分析、监控和业务智能等场景。
西里网
2025/05/22
1250
ELK学习笔记之Kibana查询和使用说明
当您第一次连接到Kibana 4时,您将进入发现页面。 默认情况下,此页面将显示您的所有ELK的最近接收的日志。 在这里,你可以根据搜索查询通过筛选,找到特定的日志消息,则缩小搜索结果与时间过滤器一个特定的时间范围。
Jetpropelledsnake21
2019/05/31
11.9K0
基于Kafka+ELK搭建海量日志平台
早在传统的单体应用时代,查看日志大都通过SSH客户端登服务器去看,使用较多的命令就是 less 或者 tail。如果服务部署了好几台,就要分别登录到这几台机器上看,等到了分布式和微服务架构流行时代,一个从APP或H5发起的请求除了需要登陆服务器去排查日志,往往还会经过MQ和RPC调用远程到了别的主机继续处理,开发人员定位问题可能还需要根据TraceID或者业务唯一主键去跟踪服务的链路日志,基于传统SSH方式登陆主机查看日志的方式就像图中排查线路的工人一样困难,线上服务器几十上百之多,出了问题难以快速响应,因此需要高效、实时的日志存储和检索平台,ELK就提供这样一套解决方案。
王知无-import_bigdata
2019/07/29
9.2K0
基于Kafka+ELK搭建海量日志平台
还在用命令行看日志?快用Kibana吧,可视化日志分析YYDS!
日志收集系统的原理是这样的,首先应用集成了Logstash插件,通过TCP向Logstash传输日志。Logstash接收到日志后根据日志类型将日志存储到Elasticsearch的不同索引上去,Kibana从Elasticsearch中读取日志,然后我们就可以在Kibana中进行可视化日志分析了,具体流程图如下。
macrozheng
2022/07/24
5820
还在用命令行看日志?快用Kibana吧,可视化日志分析YYDS!
ELK 入门介绍
可以理解为数据的搬运工,负责数据的采集,并传输给下一级(ElasticSearch)。
jgrass
2024/12/25
7000
ELK 入门介绍
搭建ELK日志分析系统
ELK Stack 是Elasticsearch、Logstash、Kiban三个开源软件的组合。在实时数据检索和分析场合,三者通常是配合共用,而且又都先后归于 Elastic.co 公司名下,故有此简称。 ELK Stack成为机器数据分析,或者说实时日志处理领域,开源界的第一选择。和传统的日志处理方案相比,ELK Stack 具有如下几个优点: • 处理方式灵活。Elasticsearch 是实时全文索引,不需要像 storm 那样预先编程才能使用; • 配置简易上手。Elasticsearch 全部采用 JSON 接口,Logstash 是 Ruby DSL 设计,都是目前业界最通用的配置语法设计; • 检索性能高效。虽然每次查询都是实时计算,但是优秀的设计和实现基本可以达到全天数据查询的秒级响应; • 集群线性扩展。不管是 Elasticsearch 集群还是 Logstash 集群都是可以线性扩展的; • 前端操作炫丽。Kibana 界面上,只需要点击鼠标,就可以完成搜索、聚合功能,生成炫丽的仪表板。 官网地址:https://www.elastic.co/cn/ 官网权威指南: https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html 安装指南: https://www.elastic.co/guide/en/elasticsearch/reference/6.x/rpm.html Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。 Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。 Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据。
菲宇
2019/06/11
1.3K0
搭建ELK日志分析系统
腾讯技术课|基于Elastic Stack 搭建日志分析平台
为了让读者们可以更好的理解「如何基于Elastic Stack 搭建日志分析平台」,腾讯技术工程公众号特别邀请腾讯基础架构部的陈曦工程师通过语音录播分享的方式在「腾讯技术课」小程序里同步录制了语音+PPT解说版,点击小程序卡片即可收听: 以下为课程文字稿: 随着互联网、物联网的飞速发展,软硬件系统架构变得越来越复杂,分析各种系统产生的日志也变得越来越困难。在日志分析过程中,相信大部分同学会碰到以下问题: 1. 定位问题耗费大量时间 通常一个系统的各模块是分散在各个机器上的,定位问题时运维同学只能逐
腾讯技术工程官方号
2018/08/29
1.5K0
腾讯技术课|基于Elastic Stack 搭建日志分析平台
ElasticSearch7.6入门学习
笔记记录 B站狂神说Java的ElasticSearch课程:https://www.bilibili.com/video/BV17a4y1x7zq
Vincent-yuan
2022/05/06
1.4K0
ElasticSearch7.6入门学习
基于Elastic Stack搭建日志分析平台
(本次课程是通过小程序对外推广的,所以PPT是竖版的。电脑端浏览体验可能不太好,望大家见谅)
用户1644123
2018/08/25
1.5K0
基于Elastic Stack搭建日志分析平台
Elastic Stack 日志收集系统笔记
elasticstack是一个应用套件,原名为ELK Stack,由elastic旗下的elasticsearch、logstash、kibana,filebeat四个组件组成,这四个工具组合形成了一套实用、易用的监控架构,很多公司利用它来搭建可视化的海量日志分析平台。
没有故事的陈师傅
2019/07/27
1K0
如何在CentOS 7上利用PacketBit和ELK收集基础设施指标
Packetbeat可以让您监视应用程序级协议(如HTTP和MySQL)以及DNS和其他服务的实时网络流量。
姚啊姚
2018/08/13
9140
15 分钟带你入门 Grafana
Grafana 是一款用 GO 语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。
GopalFeng
2022/08/01
3.5K0
15 分钟带你入门 Grafana
推荐阅读
相关推荐
Kibana(一张图片胜过千万行日志)
更多 >
LV.1
信安之路创始人
目录
  • 📖 一、题目描述
    • 示例:
  • 🧠 二、解题思路:滑动窗口 + 哈希集合
    • ✅ 为什么用滑动窗口?
  • 💻 三、Python 解法
  • 🔍 四、关键语句逐行解释
    • class Solution:
    • def lengthOfLongestSubstring(self, s: str) -> int:
    • char_set = set()
      • 🧠 Python 中 set 的特点:
    • while s[right] in char_set:
    • left += 1
  • 🧪 五、图解演示:以 “abcabcbb” 为例
  • 📈 六、复杂度分析
  • 🧩 七、常见问题答疑
    • ❓ self 是什么?
    • ❓ 为什么用 set() 而不是 list?
    • ❓ 如果我直接写一个函数不加 class 可以吗?
  • ✅ 八、简洁版本(非类形式,供本地测试)
  • 🏁 九、总结
  • ✨ 十、后记
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档