当前位置: 首页 > java >正文

转码刷 LeetCode 笔记[1]:3.无重复字符的最长子串(python)

题目描述

image

初次错解

看 B 站视频后,了解到“滑动窗口”思想,遂自己动手尝试

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:left = 0lenth = 0max_lenth = 0s = list(s)str = []for char in s:right = 0if char not in str:str.append(char)right += 1lenth = len(str)if lenth > max_lenth:max_lenth = lenthelse:str.remove(char)left += 1return max_lenth

答案分析

输入"abcabcbb",输出的是5,正确结果是3
输入"pwwkew",输出4,正确结果是3

第二次的解法

下面是 AI 根据我的解法修正的答案:

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:left = 0lenth = 0max_lenth = 0seen = set()for right in range(len(s)):while s[right] in seen:seen.remove(s[left])left += 1seen.add(s[right])lenth = right - left + 1if lenth > max_lenth:max_lenth = lenthreturn max_lenth

我错哪了呢?

没有真正维护滑动窗口的左边界,只是 left += 1,但 str 中并没有正确地移除所有在左边界左边的字符;
remove(char) 只会移除第一个匹配项,这会导致窗口状态不一致;
也没有用 left 来限制窗口范围,只是把它当成一个计数器。

观察我的答案和修正之后的答案,产生了几个问题:

  1. seen = set()为什么用set不用list,二者有什么区别?
  2. 为什么seen.remove(s[left])能移除所有在左边界左边的字符,而str.remove(char)不能?
  3. while s[right] in seen: 改成 for s[right] in seen: 是不是没有区别?
  4. 子串长度为什么用right - left + 1计算,而不用len(seen)计算?
  5. seen = set()seen={} 有什么区别?

下面来逐一解答

1. seen = set()为什么用 set 不用 list,二者有什么区别?

特性setlist
查找速度O(1)(哈希表实现)O(n)(线性扫描)
是否允许重复❌ 不允许重复元素✅ 允许重复元素
是否保持顺序❌ 不保持插入顺序(Python 3.7+ 中 set 会保留插入顺序,但不依赖它)✅ 保持插入顺序

2. 为什么seen.remove(s[left])能移除所有在左边界左边的字符,而str.remove(char)不能?

str.remove(char)

这行代码的意思是:从 list 中删除第一个等于 char 的元素;它不会删除所有在左边界左边的字符;它只是把第一次出现的那个字符删掉;所以窗口状态就乱了,并没有真正“滑动”窗口。

while s[right] in seen:seen.remove(s[left])left += 1

通过 while 循环,可以只要出现重复字符,就删掉一次该字符,并实现左边界右移,直到窗口中没有重复子串为止。

关于循环,进而又产生了新的问题

3. while s[right] in seen: 改成 for s[right] in seen: 是不是没有区别?

有区别!

语法层面的错误

for s[right] in seen: 试图把 seen 中的每个元素赋值给 s[right],也就是试图修改原字符串 s 的内容 —— 这是不允许的(字符串是不可变的),会报错:
TypeError: ‘str’ object does not support item assignment

逻辑层面的错误

for 循环会遍历 set 中的每个元素,而不是只要重复就一直删。

4. 子串长度为什么用right - left + 1计算,而不用len(seen)计算?

right - left + 1 是窗口的实际长度,也就是从 left 到 right 之间的子串长度
len(seen) 是不重复的字符数量,当把题目改为“允许最多两个重复”时,len(seen)输出的结果就不是子串长度了
只是在这道题中,这两个值相等。

5. seen = set()seen={} 有什么区别?

纯纯的基础不牢!刷题刷懵了!

seen = set()是创建一个空集合
seen={}是创建一个空字典

写法类型是否可哈希去重
set()set✅ 是
{}dict❌ 否
http://www.xdnf.cn/news/16803.html

相关文章:

  • (1-7-6)Mysql 常用的基本函数
  • JVM问题分析处理手册
  • LeetCode 面试经典 150_数组/字符串_买卖股票的最佳时机(7_121_C++_简单)(贪心)
  • 【javascript】new.target 学习笔记
  • 【2025/07/31】GitHub 今日热门项目
  • DAY16-结构体
  • linux如何将两份hdmi edid合并
  • system.conf linux用于启动和管理系统进程的初始化系统和服务管理器的配置文件
  • WEditor:高效的移动端UI自动化脚本可视化编辑器
  • 【云故事探索】NO.16:阿里云弹性计算加速精准学 AI 教育普惠落地
  • 力扣 Pandas 挑战(6)---数据合并
  • 基于SpringBoot和SpringAI框架实践
  • Google政策大更新:影响金融,Ai应用,社交,新闻等所有类别App
  • 【科研绘图系列】R语言绘制线性相关性
  • 算法训练营day37 动态规划⑤ 完全背包 518. 零钱兑换 II、 377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)
  • 排序的演进:从机械齿轮到领域专用芯片加速器的全面综述
  • 最新PS 2025安装包下载与安装教程(Adobe Photoshop 2025 )
  • 【数据结构初阶】--二叉树(六)
  • 乱删文件,电脑不能开机,怎么办
  • 【C语言】深度剖析指针(三):回调机制、通用排序与数组指针逻辑
  • DeepSeek笔记(三):结合Flask实现以WEB方式访问本地部署的DeepSeek-R1模型
  • opencv解迷宫
  • 是德科技的BenchVue和纳米软件的ATECLOUD有哪些区别?
  • RabbitMQ 的死信队列完整指南 (With Spring Boot)
  • 【13】大恒相机SDK C#开发 —— Fom1中实时处理的8个图像 实时显示在Form2界面的 pictureBox中
  • 多架构镜像整合全攻略:在Docker中实现单一镜像支持同时支持amd64和arm64架构
  • 贝锐蒲公英X4 Pro 5G新品路由器:异地组网+8网口+双频WiFi全都有
  • 网站域名备案和服务器有关系吗
  • 【源力觉醒 创作者计划】文心大模型开源:从封闭研发到生态共建的转折点
  • 设计模式:命令模式 Command