ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

找到字符串中所有字母异位词-字符串438-pythonc++

找到字符串中所有字母异位词-字符串438-pythonc++

滑动窗口。注意一定不能让need为defaultdict(int),因为如果c遍历到的字母不在need里,在if window[c] == need[c]判断时,defaultdict会为need创建c这个键(值为0),这样valid==len(need)的判断就会失效。

ps:
普通 dict 的__getitem__:key 不存在 → 直接抛KeyError。

defaultdict的__getitem__逻辑是:

  1. 先看 key 在不在字典里
  2. 不存在:调用你传入的工厂函数int(),得到默认值0
  3. 把key:默认值插入到字典本身
  4. 再返回这个默认值给你做后续判断

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+=1returnres

c++

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;}};
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进