题目
思路
使用滑动窗口(所谓滑动窗口:快慢指针 如 左、右指针都先指向第一个位置 都往右移动(大概意思)):只要记住一个准则即可:滑动窗口集合=异位词集合相等,则此时找到异位词
首先 要判断 len(s)<len (p ) 若小于,则s中无异位词 如 s=‘ab’ p=‘abc’
len(s)>=len§:
1.首先用pdict、count来表示异位词集合、滑动窗口集合(每个字符所对应的个数,count集合里的字符个数默认为0) 如 p =‘abc’ 则pdict={‘a’:1,‘b’:1,‘c’:1} count={‘a’:0,‘b’:0,‘c’:0} 注意:滑动窗口集合的键是固定的(跟pdict的键一模一样)、不可添加,也不可减少
2.对于字符串s,先看以len§为长度的滑动窗口的键的值个数
3.接着 左指针从0开始,右指针从len§-1开始(原因在2),依次去遍历 移动左、右指针时,代表窗口的改变,此时要记得改变滑动窗口对应键的值
例子:
s = “cbaebabacd”, p = “abc”
pdict={‘a’:1,‘b’:1,‘c’:1} count={‘a’:0,‘b’:0,‘c’:0}
遍历s中“cba” count={‘a’:1,‘b’:1,‘c’:1} 此时:l = 0 r = 2
count ==pdict 找到异位词,首字符位置,l向右移动 r也向右移动 此时滑动窗口由cba 变为bae 即移除c 加上e ,所以 要让count中c键值-1 (不设置为0原因 预防 字符串‘aaaaa’情况) 依次类推
时间复杂度: O(n)
代码
class Solution(object):def findAnagrams(self, s, p):""":type s: str:type p: str:rtype: List[int]"""'''超限(忽略)'''# t=[]# i = 0# step = len(p)# if len(s)<step:# return []# if s==p:# return [0]# p1 = sorted(p)# while i<=len(s)-step:# if sorted(s[i:i+step])== p1:# t.append(i)# i+=1# return t'''方法二:滑动窗口'''pdict = {}count ={}ans=[]step = len(p)if len(s)<step:return []for i in p:if i not in pdict:pdict[i] = 1count[i] = 0else:pdict[i]+=1for i in range(step):if s[i] in pdict:count[s[i]]+=1l = 0r =step-1while r<len(s):if count==pdict:ans.append(l)if s[l] in pdict:count[s[l]] -=1l+=1r+=1if r<len(s):if s[r] in pdict:count[s[r]]+=1return ans