LeetCode 热题100 3. 无重复字符的最长子串

devtools/2025/3/4 14:22:16/

LeetCode 热题100 | 3. 无重复字符的最长子串

大家好,今天我们来解决一道经典的算法题——无重复字符的最长子串。这道题在 LeetCode 上被标记为中等难度,要求我们找出一个字符串中不含有重复字符的最长子串的长度。下面我将详细讲解解题思路,并附上 Python 代码实现。


题目描述

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

示例:

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

解题思路

这道题的核心是找到一个不包含重复字符的子串,并返回其最大长度。我们可以使用 滑动窗口 来解决这个问题。

核心思想

  1. 滑动窗口

    • 使用两个指针 leftright 表示当前子串的左右边界。
    • 使用一个哈希集合 char_set 来记录当前子串中的字符。
  2. 窗口扩展

    • 移动 right 指针,将字符加入 char_set
    • 如果字符已经存在于 char_set 中,则移动 left 指针,直到 char_set 中不再有重复字符。
  3. 更新最大长度

    • 每次扩展窗口后,更新最大子串长度。

代码实现

def lengthOfLongestSubstring(s):""":type s: str:rtype: int"""char_set = set()  # 用于记录当前子串中的字符left = 0  # 滑动窗口的左边界max_length = 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_length = max(max_length, right - left + 1)return max_length

代码解析

  1. 初始化

    • char_set 用于记录当前子串中的字符。
    • left 是滑动窗口的左边界,初始为 0。
    • max_length 是最大子串长度,初始为 0。
  2. 滑动窗口扩展

    • 遍历字符串,移动 right 指针。
    • 如果当前字符 s[right] 已经存在于 char_set 中,则移动 left 指针,并从 char_set 中移除 s[left],直到 char_set 中不再有重复字符。
  3. 更新最大长度

    • 将当前字符 s[right] 加入 char_set
    • 更新 max_length 为当前窗口长度 right - left + 1max_length 的较大值。
  4. 返回结果

    • 返回 max_length

复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串的长度。每个字符最多被访问两次(leftright 各一次)。
  • 空间复杂度:O(min(m, n)),其中 m 是字符集的大小(ASCII 字符集为 128),n 是字符串的长度。char_set 的大小最多为字符集的大小。

示例运行

示例 1

# 输入: s = "abcabcbb"
s = "abcabcbb"
print(lengthOfLongestSubstring(s))  # 输出: 3

解释

  • 最长无重复字符的子串是 "abc",长度为 3。

示例 2

# 输入: s = "bbbbb"
s = "bbbbb"
print(lengthOfLongestSubstring(s))  # 输出: 1

解释

  • 最长无重复字符的子串是 "b",长度为 1。

示例 3

# 输入: s = "pwwkew"
s = "pwwkew"
print(lengthOfLongestSubstring(s))  # 输出: 3

解释

  • 最长无重复字符的子串是 "wke",长度为 3。

总结

通过滑动窗口法,我们可以高效地找到无重复字符的最长子串。这种方法的时间复杂度为 O(n),空间复杂度为 O(min(m, n)),能够处理较大的输入规模。希望这篇题解对你有帮助!如果还有其他问题,欢迎继续提问!

关注我,获取更多算法题解和编程技巧!


http://www.ppmy.cn/devtools/164475.html

相关文章

c#之xml文件的增删改查实例

在C#中&#xff0c;可以使用System.Xml命名空间中的类来对XML文件进行增删改查操作。以下是完整的示例代码&#xff0c;展示如何对XML文件进行增删改查。 1. XML文件结构 假设我们有一个books.xml文件&#xff0c;内容如下&#xff1a; <books><book id"1"…

Halcon 算子-承接车牌识别

1.rgb1_to_gray&#xff08;Image,GrayImage&#xff09; Image: 输入的图像GrayImage&#xff1a; 输出的灰度图像 2.threshold&#xff08;GrayImage,Regions,Sigma,Sigma&#xff09; GrayImage: 输入的图像Regions&#xff1a; 输出的区域Sigma&#xff1a; 调节的参数 3…

【AIDevops】驱动无界面自动化运维与分布式脚本系统,初探运维革命之路

声明&#xff1a;笔者当前文章内容仍在构想阶段&#xff0c;仅部分实现 目录 引言 第一部分&#xff1a;基于DeepSeek大模型的单机GPT实现 1. DeepSeek大模型简介 2. 功能概述 3. 项目优势&#xff0c;实现技术栈及实现功能 4. 示例展示 5.腾讯云AI代码助手助力 第二部…

unity pico开发 五 UI交互

文章目录 添加画布添加交互组件取消传送射线对UI的控制解决按扳机键会传送的冲突按下按键呼出菜单&#xff0c;并让菜单出现在头的前方 添加画布 创建一个新画布&#xff0c;添加一个Button&#xff0c;将画布改为world space&#xff0c;然后缩放改为0.001&#xff0c;调整到…

Firefox缩小标签页高度以及自定义调整

转自&#xff1a;https://www.cnblogs.com/dirgo/p/17672716.html 有修改 新版的火狐标签页和地址栏太高了&#xff0c;比chrome和Edge都要高不少&#xff0c;有点浪费屏幕空间&#xff0c;不知道官方为什么这样设计。网上搜索&#xff0c;发现有一个紧凑模式&#xff0c;开了以…

图形化界面MySQL(MySQL)(超级详细)

目录 1.官网地址 1.1在Linux直接点击NO thanks…? 1.2任何远端登录&#xff0c;再把jj数据库给授权 1.3建立新用户 优点和好处 示例代码&#xff08;MySQL Workbench&#xff09; 示例代码&#xff08;phpMyAdmin&#xff09; 总结 图形化界面 MySQL 工具大全及其功能…

《Zookeeper 分布式过程协同技术详解》读书笔记-2

目录 zk的一些内部原理和应用请求&#xff0c;事务和标识读写操作事务标识&#xff08;zxid&#xff09; 群首选举Zab协议&#xff08;ZooKeeper Atomic Broadcast protocol&#xff09;文件系统和监听通知机制分布式配置中心, 简单Demojava code 集群管理code 分布式锁 zk的一…

以太坊基金会换帅,资本市场砸盘

Vitalik力挺Aya升任EF主席&#xff0c;理想主义冬日发芽&#xff1f; 作者&#xff1a;Wenser&#xff1b;编辑&#xff1a;秦晓峰 出品 | Odaily星球日报&#xff08;ID&#xff1a;o-daily&#xff09; 2 月 27 日&#xff0c;Bybit 15 亿资金被盗事件的最新调查结果将以太坊…