438. 找到字符串中所有字母异位词

题面:

 

 题解:维护长度为p的长度的滑动窗口,cnts维护当前窗口内个字母s与p的差,用一个变量res维护不同的数量,当res=0时是异位词。

class Solution {
public:
int cnts[26];
int cntp[26];
    vector<int> findAnagrams(string s, string p) {
              vector<int> ans;
              int n = s.size();
              int m = p.size();
              int res = 0;
              if(n<m) return ans;
              for(int i = 0;i < m;i ++)
              {
                  cnts[ s[i] -'a' ] ++;
                  cntp[ p[i] - 'a']++;
              }
              for(int i=0;i<26;i++)
              {
                  cnts[i]-=cntp[i];
                  if(cnts[i] != 0)
                     res++;
              }
              if(res == 0)ans.push_back(0);
              for(int i = m ;i < n;i ++)
              {
                        if(cnts[s[i-m] - 'a']==1)
                                 res--;
                        if(cnts[s[i-m]]-'a'==0)
                                 res++;
                        cnts[ s[i-m] - 'a' ] --;
                         if(cnts[s[i] - 'a']==-1)
                                 res--;
                        if(cnts[s[i]]-'a'==0)
                                 res++;
                        cnts[ s[i] - 'a' ] ++;
                        if(res==0)
                        ans.push_back(i-m+1);
              }
              return ans;
    }
};

 

posted @ 2022-01-20 20:12  cumtljz  阅读(19)  评论(0编辑  收藏  举报