题目链接:https://leetcode.com/problems/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"
思路:直接的方式是暴力用hash,这样时间复杂度O(m*n).可以用hash+slide window来优化到O(n).
代码如下:
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int> hash1(256), hash2(256);
for(auto ch: p) hash1[ch]++;
int lenp = p.size(), lens = s.size();
vector<int> ans;
for(int i = 0; i < lens; i++)
{
hash2[s[i]]++;
if(i >= lenp) hash2[s[i-lenp]]--;
if(hash1 == hash2) ans.push_back(i-lenp+1);
}
return ans;
}
};