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) {
        if(s.empty()||p.empty())return {};
        vector<int>ans;
        vector<int>hash(128,0);
        for(char c: p){
            hash[c]++;
        }
        int st=0,en=0,d=p.size();
        while(en<s.length()){
            if(hash[s[en]]>0){//如果当前元素出现在了p串中,计数-1
                d--;
            }
            hash[s[en]]--;//当前字母出现的次数-1
            en++;
            if(d==0)ans.push_back(st);//如果计数为0,说明找到了符合条件的位置
            if(en-st==p.size()){//当前的窗口大小达到了p的大小,将窗口右移一格
                if(hash[s[st]]>=0)d++;//如果当前的字母曾在p中,则计数+1
                hash[s[st]]++;//这个字母出现的次数+1
                st++;
            }
        }
        return ans;
    }
};

 

posted @ 2017-03-29 17:01  Tsunami_lj  阅读(130)  评论(0编辑  收藏  举报