[leetcode] 438. Find All Anagrams in a String

Given a string s and a non-empty string p, find all the start indices of p's anagrams in s.

Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100.

The order of output does not matter.

Example 1:

Input: s: "cbaebabacd" p: "abc"

Output: [0, 6]

Explanation:
The substring with start index = 0 is "cba", which is an anagram of "abc".
The substring with start index = 6 is "bac", which is an anagram of "abc".

Example 2:

Input:s: "abab" p: "ab"

Output: [0, 1, 2]

Explanation:
The substring with start index = 0 is "ab", which is an anagram of "ab".
The substring with start index = 1 is "ba", which is an anagram of "ab".
The substring with start index = 2 is "ab", which is an anagram of "ab".

这道题跟前面的那道非常相似,同样是采用计数排数的形式进行解题

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int>ret;
        int lens = s.length(), lenp = p.length();
        if(lens < lenp) return ret;
        int cnt[26] = {0};

        auto check = [&] {
            for(int i = 0; i < 26; ++i)
                if(cnt[i]) return false;
            return true;
        };

        for(int i = 0; i < lenp; ++i) {
            cnt[s[i] - 'a'] += 1;
            cnt[p[i] - 'a'] -= 1;
        }

        if(check()) ret.push_back(0);

        for(int i = 1; i + lenp <= lens; ++i) {
            cnt[s[i - 1] - 'a'] -= 1;
            cnt[s[i + lenp - 1] - 'a'] += 1;
            if(check()) ret.push_back(i);
        }

        return ret;
    }
};
posted @ 2017-09-03 09:38  狂徒归来  阅读(183)  评论(0编辑  收藏  举报