☰
找到字符串中所有字母异位词-字符串438-pythonc++
2026/11/2 10:41:24 网站建设 项目流程

滑动窗口。注意一定不能让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;}};

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询