题目:
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 :
输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
答案:
from collections import Counter
def findAnagrams(s: str, p: str) -> List[int]:
m, n = len(p), len(s)
if m > n:
return []
# 初始化 p 的字符计数
p_counts = Counter(p)
# 初始化滑动窗口的字符计数
window_counts = Counter()
# 初始化结果列表
result = []
# 遍历 s,维护一个长度为 m 的滑动窗口
left = 0
for right in range(n):
# 窗口向右滑动,添加新的字符到窗口
window_counts[s[right]] += 1
# 当窗口大小达到 m,开始检查窗口的字符计数
if right >= m - 1:
# 如果窗口最左边的字符在 p 中出现,并且出现次数大于 0,则减少其计数
if s[left] in p_counts and window_counts[s[left]] > p_counts[s[left]]:
window_counts[s[left]] -= 1
# 移动窗口左边界
left += 1
# 检查窗口的字符计数是否与 p 的字符计数匹配
if window_counts == p_counts:
result.append(left)
# 如果窗口最左边的字符在 p 中出现,并且出现次数为 0,则需要重新计数
if s[left] in p_counts and window_counts[s[left]] == p_counts[s[left]]:
window_counts[s[left]] -= 1
return result
# 示例
s = "cbaebabacd"
p = "abc"
print(findAnagrams(s, p)) # 输出: [0, 6]