前言
- 在家整个人就犯懒了...学习懒惰+社交懒惰,除了每天做家教,一整天也没做什么正事,要实在不想学习就和去年过年那样看看书也行啊
3. 无重复字符的最长子串 - 力扣(LeetCode)
- 还是灵神的题解最清晰,滑动窗口的模板参考【代码随想录】刷题笔记Day5
- 用set存字符,遇到重复的就收缩左窗口,更新最大值
- 顺序:收缩 -> 增加 -> 判定
-
class Solution: def lengthOfLongestSubstring(self, s: str) -> int: ans = left = 0 window = set() # 维护从下标 left 到下标 right 的字符 for right, c in enumerate(s): while c in window: # 加入 c 后,窗口内会有重复元素 window.remove(s[left]) left += 1 # 缩小窗口 window.add(c) ans = max(ans, right - left + 1) # 更新窗口长度最大值 return ans
438. 找到字符串中所有字母异位词 - 力扣(LeetCode)
- 滑动窗口,先存p的字符数量,右指针遍历s,用完就收缩左指针补,记录长度相同结果
- 顺序:使用 -> 收缩 -> 判定
-
class Solution: def findAnagrams(self, s: str, p: str) -> List[int]: s_len, p_len, res = len(s), len(p), [] counts = [0] * 26 # 长度26值为0的数组 # 存储p串的字符数量 for c_p in p: counts[ord(c_p) - ord("a")] += 1 # 滑动窗口 l = 0 for r in range(s_len): counts[ord(s[r]) - ord('a')] -= 1 # 记录 # 当右侧用完了,收缩左侧 while counts[ord(s[r]) - ord('a')] < 0: counts[ord(s[l]) - ord('a')] += 1 l += 1 # [l, r]长度相同记录结果 if r - l + 1 == p_len: res.append(l) return res
后言
- 下午睡了两小时,我是🐖,滑动窗口的思路重新学了一下,明天继续