题目
给定两个字符串
s
和p
,找到s
中所有p
的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
解题
from collections import Counter
def findAnagrams(s: str, p: str):
# 字符串 p 的字符频率
p_count = Counter(p)
# 滑动窗口的大小
window_size = len(p)
# 结果列表
result = []
# 初始窗口的字符频率
window_count = Counter(s[:window_size - 1])
# 滑动窗口遍历字符串 s
for i in range(window_size - 1, len(s)):
# 将新字符加入窗口
window_count[s[i]] += 1
# 检查当前窗口的字符频率是否与 p 的字符频率相等
if window_count == p_count:
result.append(i - window_size + 1)
# 移出窗口最左边的字符
window_count[s[i - window_size + 1]] -= 1
# 如果频率为 0,则删除该字符
if window_count[s[i - window_size + 1]] == 0:
del window_count[s[i - window_size + 1]]
return result
s = "cbaebabacd"
p = "abc"
print(findAnagrams(s, p)) # 输出: [0, 6]