sliding window O(m+n) time O(1) space
跟30. Substring with Concatenation of All Words解法基本一样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
   | class Solution { public:     vector<int> findAnagrams(string s, string p) {         int f[26] = {0};         for (char c : p) {             ++f[c - 'a'];         }         vector<int> res;         for (int m = s.length(), n = p.length(), cnt = 0, i = 0; i < m; ++i) {             if (--f[s[i] - 'a'] >= 0) {                 ++cnt;             }             if (i >= n && ++f[s[i - n] - 'a'] > 0) {                 --cnt;             }             if (cnt == n) {                 res.push_back(i - n + 1);             }         }         return res;     } };
  | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   | class Solution { public:     vector<int> findAnagrams(string s, string p) {         vector<int> mp(26), mc(26);         for (char c : p) {             ++mp[c - 'a'];         }         vector<int> res;         int m = p.length(), n = s.length();         for (int i = 0; i < n; ++i) {             ++mc[s[i] - 'a'];             if (i >= m - 1) {                  if (mc == mp) {                     res.push_back(i - m + 1);                 }                 --mc[s[i - m + 1] - 'a'];             }         }         return res;     } };
  |