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

中等 · 滑动窗口

题目

438. 找到字符串中所有字母异位词 官方题解

方法一:滑动窗口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> countP(26, 0), countS(26, 0);
        vector<int> result;
        int lenP = p.length(), lenS = s.length();

        for (char c : p) {
            countP[c - 'a']++;
        }

        for (int i = 0; i < lenS; i++) {
            countS[s[i] - 'a']++;

            if (i >= lenP) {
                countS[s[i - lenP] - 'a']--;
            }

            if (countS == countP) {
                result.push_back(i - lenP + 1);
            }
        }

        return result;
    }
};

方法二:滑动窗口优化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> count(26, 0);
        vector<int> result;
        int lenP = p.length(), lenS = s.length();
        int left = 0, right = 0, diff = lenP;

        for (char c : p) {
            count[c - 'a']++;
        }

        while (right < lenS) {
            if (count[s[right] - 'a'] > 0) {
                diff--;
            }
            count[s[right] - 'a']--;
            right++;

            if (right - left == lenP) {
                if (diff == 0) {
                    result.push_back(left);
                }
                if (count[s[left] - 'a'] >= 0) {
                    diff++;
                }
                count[s[left] - 'a']++;
                left++;
            }
        }

        return result;
    }
};