leetcode hot100 3.无重复字符的最长子串 medium 滑动窗口(双指针)

核心思想:滑动窗口(双指针)

维护一个区间:

python 复制代码
[left ...... right]

这个区间 始终保证:没有重复字符

遍历规则

right 向右扩展

如果 s[right] 没出现过,扩大窗口,更新最大长度

如果 s[right] 已经在窗口里,缩小 left(直到s[right] 不在窗口里)

直到重复字符被移出

python 复制代码
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if not s:
            return 0

        left = 0
        max_len = 0

        for right in range(len(s)):
            # 检查是否有重复
            while s[right] in s[left:right]:   # 有重复的就右移左指针,直到没有重复的
                left += 1

            max_len = max(max_len, right - left + 1)

        return max_len

时间复杂度 O(n)

in 操作的成本:

while s[right] in s[left:right] 的操作虽然看起来是 O(n) 的操作(因为它在 left:right 的子串上查找),但由于每个字符的 left 和 right 只移动一次,in 操作的时间成本不会累积成 O(n²)。它们是分散的,所以总的时间复杂度是 O(n)。

空间复杂度: O(1)

除了输入字符串 s 外,程序只使用了两个额外的变量:left 和 max_len,它们都占用常量空间。

相关推荐
踏着七彩祥云的小丑4 小时前
pytest——Mark标记
开发语言·python·pytest
不爱吃炸鸡柳5 小时前
Python入门第一课:零基础认识Python + 环境搭建 + 基础语法精讲
开发语言·python
Dxy12393102165 小时前
Python基于BERT的上下文纠错详解
开发语言·python·bert
语戚6 小时前
力扣 968. 监控二叉树 —— 贪心 & 树形 DP 双解法递归 + 非递归全解(Java 实现)
java·算法·leetcode·贪心算法·动态规划·力扣·
skywalker_116 小时前
力扣hot100-7(接雨水),8(无重复字符的最长子串)
算法·leetcode·职场和发展
SiYuanFeng7 小时前
Colab复现 NanoChat:从 Tokenizer(CPU)、Base Train(CPU) 到 SFT(GPU) 的完整踩坑实录
python·colab
炸炸鱼.7 小时前
Python 操作 MySQL 数据库
android·数据库·python·adb
田梓燊8 小时前
leetcode 160
算法·leetcode·职场和发展
_深海凉_8 小时前
LeetCode热题100-颜色分类
python·算法·leetcode
AC赳赳老秦9 小时前
OpenClaw email技能:批量发送邮件、自动回复,高效处理工作邮件
运维·人工智能·python·django·自动化·deepseek·openclaw