[438][中等][滑动窗口] 找到字符串中所有字母异位词
题目描述
输入:
s: "cbaebabacd" p: "abc"
输出:
[0, 6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的字母异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的字母异位词。解题思路
最后更新于
输入:
s: "cbaebabacd" p: "abc"
输出:
[0, 6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的字母异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的字母异位词。最后更新于
输入:
s: "abab" p: "ab"
输出:
[0, 1, 2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的字母异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的字母异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的字母异位词。class Solution:
def findAnagrams(self, s: str, p: str) -> List[int]:
n, p_count = len(s), len(p)
p_map = Counter(p)
s_map, s_count = dict(), 0
res = []
left = right = 0
while right < n:
char = s[right]
right += 1
if char not in p_map:
s_map.clear()
s_count = 0
left = right
else:
count = s_map.get(char, 0)
s_map[char] = count + 1
if count < p_map[char]:
s_count += 1
while right - left == p_count:
if s_count == p_count:
res.append(left)
char = s[left]
left += 1
count = s_map.get(char, 0)
s_map[char] = count - 1
if count <= p_map[char]:
s_count -= 1
return res