R6-滑动窗口篇
印象题
核心:
使用collections方法的Counter计数,统计了某个子串中每个字母出现的次数。
判断子串相等:counter1=counter2
(注意:此时,counter1或者counter2都不能含有多余的项(尽管可能为0))
思路:
先统计一遍p的counter1
接着开始滑动窗口,每次从右边增加一个字符。因此初始滑动窗口大小为len(p)-1,当从右边增加一个元素,判断counter1是否等于counter2
相等:append(left)
下一次预备:
如果counter2中left对应的字符数量为0,需要删除,避免影响下一次的判断
left和right指针都向右移动
class Solution:
def findAnagrams(self, s: str, p: str) -> List[int]:
counter1=collections.Counter(p)
left,right=0,len(p)-1
counter2=collections.Counter(s[0:right])
ret=[]
while right<len(s):
counter2[s[right]]+=1
if counter1==counter2:
ret.append(left)
counter2[s[left]]-=1
if counter2[s[left]]==0:
del counter2[s[left]]
right+=1
left+=1
return ret