题目链接:
力扣https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/
【分析】这道题采用滑动窗口,窗口大小为p字符串的长度,用一个字典来维护窗口中字符的个数——每次滑动一个字符时,就把窗口前的字符个数-1,新覆盖的字符个数+1。为了便于初始化,直接把p接在s前面,这样初始时字典中就是正确的字符的个数。但是需要注意可能会出现负的下标,将这种的排除就好了。
class Solution:
def findAnagrams(self, s: str, p: str) :
from collections import Counter
from copy import deepcopy
a = p + s
n = len(p)
res = []
tab = Counter(p)
tmp = deepcopy(tab)
for i in range(1, len(s) + 1):
tmp[a[i - 1]] -= 1
tmp[a[i + n - 1]] = tmp.get(a[i + n - 1], 0) + 1
flag = 1
for k in tab:
if tab[k] != tmp[k]:
flag = 0
break
if flag == 1 and i - n > 0:
res.append(i - n)
return res