滑动窗口。注意一定不能让need为defaultdict(int),因为如果c遍历到的字母不在need里,在if window[c] == need[c]判断时,defaultdict会为need创建c这个键(值为0),这样valid==len(need)的判断就会失效。
ps:
普通 dict 的__getitem__:key 不存在 → 直接抛KeyError。
defaultdict的__getitem__逻辑是:
- 先看 key 在不在字典里
- 不存在:调用你传入的工厂函数
int(),得到默认值0 - 把
key:默认值插入到字典本身 - 再返回这个默认值给你做后续判断
python
classSolution(object):deffindAnagrams(self,s,p):""" :type s: str :type p: str :rtype: List[int] """left=right=0valid=0res=[]window=dict()need=dict()forninp:ifninneed:need[n]+=1else:need[n]=1whileright<len(s):c=s[right]right+=1ifcinwindow:window[c]+=1else:window[c]=1ifcinneed:ifwindow[c]==need[c]:valid+=1whileright-left==len(p):ifvalid==len(need):res.append(left)d=s[left]ifdinneed:ifwindow[d]==need[d]:valid-=1window[d]-=1left+=1returnresc++
classSolution{public:vector<int>findAnagrams(string s,string p){// 滑动窗口unordered_map<char,int>need;unordered_map<char,int>window;intleft=0,right=0;intvalid=0;vector<int>res;// 将p的字符哈希表化for(auto&c:p){need[c]++;}inttarget=need.size();while(right<s.size()){// 扩大窗口charc=s[right];right++;window[c]++;if(window[c]==need[c]){valid++;}// 窗口长度超过p的长度,缩小窗口while(right-left>=p.size()){if(valid==target){res.emplace_back(left);}chard=s[left];left++;if(window[d]==need[d])valid--;window[d]--;}}returnres;}};