找到字符串中所有字母异位词
Find All Anagrams in a String
本机进度仅保存在当前浏览器
题目描述
给定两个字符串 s 和 p,找到 s 中所有 p 的异位词(字母相同、顺序可不同)子串,返回这些子串的起始索引。
示例:s = "cbaebabacd",p = "abc",输出 [0, 6],对应子串 "cba" 与 "bac"。
解题思路
- 异位词长度固定为 len(p),是典型的定长滑动窗口:窗口每次右移一格,进一个字符出一个字符。
- 维护窗口内字母计数与 p 的计数,比较是否相等;用「差值计数」或 matched 变量避免每步 O(26) 全比较。
- 窗口长度未达到 len(p) 前只进不出,达到后每步先出后进(或先判再出),保持定长。
参考实现
查看参考实现Python · 建议先自行作答
from collections import Counter
def findAnagrams(s, p):
need = Counter(p)
window = Counter()
res = []
k = len(p)
for i, ch in enumerate(s):
window[ch] += 1
if i >= k:
left = s[i - k]
window[left] -= 1
if window[left] == 0:
del window[left]
# 定长窗口计数与目标一致即为异位词
if i >= k - 1 and window == need:
res.append(i - k + 1)
return res