2022年3月22日开始 挑战每日一题 题库不限
希望能坚持 希望广大网友监督 共勉
方法简介:
1.滑动窗口:
顾名思义,就是有一个大小可变的窗口,左右两端方向一致的向前滑动(右端固定,左端滑动;左端固定,右端滑动)
比如对于列表[1, 2, 3, 4, 5, 6]
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
[4, 5, 6]
相当于反复执行移除第一个元素和append后一个元素的操作
一般适用于字符串和列表类型题目,要求最值(最大长度,最短长度等等)或者子序列的情况,偶尔和哈希表一同出现
2. 哈希表:
对于python来说是字典等,可以实现O(1)的查找和插入操作
一般适用于快速判断一个元素是否在集合当中出现
3.思路:
新建一个集合用于储存不重复的字符串
获取字符串长度作为循环的次数
右指针从-1开始移动即一开始未进入字符串,左指针从0开始直到最后一个字符(循环len次)
当右指针所指的字符在字符串中不存在 且指针可以向右移动的时候 (while)
向集合添加右指针所指的字符
右指针向右移动
当结束while时
比较当前滑动窗口长度和之前的长度(初始值设为0)
储存最大的窗口长度
左指针向右移动
返回 储存的最大的窗口长度
代码实现部分
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
n = len(s)
rk, ans = -1, 0 #设置右指针 答案初始化为0
set1 = set() # 新建集合
for lk in range(n):
while rk + 1 < n and s[rk + 1] not in set1: #这里记得是不在集合而不是不在字符串中
#当右指针可以继续移动并且右指针移动后指向的字符不在字符串中
rk += 1 #记得先给rk加一
set1.add(s[rk])
# 集合添加元素 右指针向右移动
# 当循环结束 右指针不能移动(结束)或者右指针对应的下一个字符在字符串中
ans = max(ans, rk - lk +1) # 计算当前最大窗口
set1.remove(s[lk]) # 左指针向右移动 窗口滑动
return ans
共勉