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;
}
};