转码刷 LeetCode 笔记[1]:3.无重复字符的最长子串
题目描述

初次错解
看 B 站视频后,了解到“滑动窗口”思想,遂自己动手尝试
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
left = 0
lenth = 0
max_lenth = 0
s = list(s)
str = []
for char in s:
right = 0
if char not in str:
str.append(char)
right += 1
lenth = len(str)
if lenth > max_lenth:
max_lenth = lenth
else:
str.remove(char)
left += 1
return max_lenth
答案分析
输入"abcabcbb",输出的是5,正确结果是3
输入"pwwkew",输出4,正确结果是3
第二次的解法
下面是 AI 根据我的解法修正的答案:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
left = 0
lenth = 0
max_lenth = 0
seen = set()
for right in range(len(s)):
while s[right] in seen:
seen.remove(s[left])
left += 1
seen.add(s[right])
lenth = right - left + 1
if lenth > max_lenth:
max_lenth = lenth
return max_lenth
我错哪了呢?
没有真正维护滑动窗口的左边界,只是 left += 1,但 str 中并没有正确地移除所有在左边界左边的字符;
remove(char) 只会移除第一个匹配项,这会导致窗口状态不一致;
也没有用 left 来限制窗口范围,只是把它当成一个计数器。
观察我的答案和修正之后的答案,产生了几个问题:
seen = set()为什么用set不用list,二者有什么区别?- 为什么
seen.remove(s[left])能移除所有在左边界左边的字符,而str.remove(char)不能? while s[right] in seen:改成for s[right] in seen:是不是没有区别?- 子串长度为什么用
right - left + 1计算,而不用len(seen)计算? seen = set()和seen={}有什么区别?
下面来逐一解答
1. seen = set()为什么用 set 不用 list,二者有什么区别?
| 特性 | set |
list |
|---|---|---|
| 查找速度 | 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 |
否 |
转码刷 LeetCode 笔记[1]:3.无重复字符的最长子串的更多相关文章
- Leetcode(3)无重复字符的最长子串
Leetcode(3)无重复字符的最长子串 [题目表述]: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 第一种方法:暴力 执行用时:996 ms: 内存消耗:12.9MB 效果: ...
- leetcode刷题第三天<无重复字符的最长子串>
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 : 输入: "abcabcbb" 输出: 解释: 因为无重复字符的最长子串是 . 示例 : 输入: &quo ...
- leetcode 刷题(3)--- 无重复字符的最长子串
给定一个字符串,找出不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 无重复字符的最长子串是 "abc",其长度为 ...
- 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)
目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...
- leetcode题解#3:无重复字符的最长子串
leetcode题解:无重复字符的最长子串 题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb"输出: 3 解释 ...
- Leetcode题库——3.无重复字符的最长子串
@author: ZZQ @software: PyCharm @file: lengthOfLongestSubstring.py @time: 2018/9/18 20:35 要求:给定一个字符串 ...
- LeetCode 第三题--无重复字符的最长子串
1. 题目 2.题目分析与思路 3.思路 1. 题目 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3 ...
- Leetcode(3)-无重复字符的最长子串
给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. 给定 &q ...
- leetcode刷题笔记-3. 无重复字符的最长子串(java实现)
题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "ab ...
- python刷LeetCode:3.无重复字符的最长子串
难度等级:中等 题目描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 ...
随机推荐
- Delegate的Target,Method
在 C# 中,Delegate 是一种引用方法的类型,可以将方法视为对象进行传递和操作.Delegate 类型的实例可以用来引用一个或多个方法,然后可以将这些引用作为参数传递给其他方法,或者用来调用这 ...
- java数组--对象数组的随机赋值及其他
包含考点: 对象数组的随机赋值 浮点数的指定位数 换用思路进行对象数组的某一属性进行排序 现有Book类,定义如下: private String author; private String ISB ...
- SQL注入常用爆库语句
SQL注入的时候,找到了注入点,但是老是搞不清怎么爆库,最后还是得看大佬的WP 最后,终于下定决心自己整理一下爆库的常用语句和思路,如果哪里写的不对麻烦在评论区指出:-D 省流概要 select gr ...
- 「C++黑魔法」future与promise:不加锁的异步编程,原来可以这么简单!
大家好,我是小康. 你是否曾经为了让程序同时做多件事而绞尽脑汁?是否被多线程编程的各种锁.条件变量搞得头昏脑胀?今天,我要告诉你一个秘密武器,让你轻松驾驭异步编程的海洋! 前言:为什么要学future ...
- E - Stamp
题目链接 : E - Stamp (atcoder.jp) 题意:给定长为n的s串,m的t串,和一个长度为n的x串,问你能否操作任意次数的操作, 每次操作都可以使x中长度为m的存在串变为t,最后使得变 ...
- 开源ERP系统 Odoo 18 介绍
开源ERP系统 Odoo 18 介绍 1. ERP 简介 企业资源计划(ERP,Enterprise Resource Planning)是一种集成软件系统,旨在帮助企业管理和优化业务流程.ERP 系 ...
- 代码随想录第四天 | 链表part02
两两交换链表中的节点 用虚拟头结点,这样会方便很多. 本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点. 题目链接/文章讲解/视频讲解: https: ...
- ChatterBot人工智能,聊天机器人,无坑指南(安装,使用)(2.使用篇)
上一篇(安装):https://www.cnblogs.com/Ctrl-cCtrl-v/p/13220584.html 基础代码: 1 from chatterbot import ChatBot ...
- vivo Pulsar 万亿级消息处理实践(2)-从0到1建设 Pulsar 指标监控链路
作者:vivo 互联网大数据团队- You Shuo 本文是<vivo Pulsar万亿级消息处理实践>系列文章第2篇,Pulsar支持上报分区粒度指标,Kafka则没有分区粒度的指标,所 ...
- 万字长文彻底剖析Python正则表达式
正则表达式在各种语言中都是一个复杂的主题,在Python中,正则表达式设计的尤其复杂以适应不同场景下的脚本. python官方文档提供了正则表达式使用中的各种细节: <正则表达式指南> & ...