Given two strings s
and p
, return an array of all the start indices of p
's anagrams in s
. You may return the answer in any order.
An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once.
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".
Constraints:
1 <= s.length, p.length <= 3 * 104
s
andp
consist of lowercase English letters.
Companies:
Amazon, Microsoft, Bloomberg, Snapchat, Google, Expedia, Facebook, Yandex, Oracle, Redfin
Related Topics:
Hash Table, String, Sliding Window
Similar Questions:
// OJ: https://leetcode.com/problems/find-all-anagrams-in-a-string/
// Author: github.com/lzl124631x
// Time: O(M + RN) where `R` is the range of characters
// Space: O(R)
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int target[26] = {}, cnt[26] = {};
for (char c : p) target[c - 'a']++;
vector<int> ans;
for (int i = 0; i < s.size(); ++i) {
cnt[s[i] - 'a']++;
if (i >= p.size()) cnt[s[i - p.size()] - 'a']--;
int j = 0;
for (; j < 26 && target[j] == cnt[j]; ++j);
if (j == 26) ans.push_back(i - p.size() + 1);
}
return ans;
}
};
Or
// OJ: https://leetcode.com/problems/find-all-anagrams-in-a-string/
// Author: github.com/lzl124631x
// Time: O(M + RN) where `R` is the range of characters
// Space: O(1)
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int cnt[26] = {};
for (char c : p) cnt[c - 'a']++;
vector<int> ans;
for (int i = 0, N = s.size(), M = p.size(); i < N; ++i) {
cnt[s[i] - 'a']--;
if (i - M >= 0) cnt[s[i - M] - 'a']++;
int j = 0;
while (j < 26 && cnt[j] == 0) ++j;
if (j == 26) ans.push_back(i - M + 1);
}
return ans;
}
};
// OJ: https://leetcode.com/explore/challenge/card/may-leetcoding-challenge/536/week-3-may-15th-may-21st/3332/
// Author: github.com/lzl124631x
// Time: O(M + N)
// Space: O(R) where `R` is the range of characters
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int cnt[26] = {}, matched = 0;
for (char c : p) cnt[c - 'a']++;
vector<int> ans;
for (int i = 0; i < s.size(); ++i) {
if (--cnt[s[i] - 'a'] >= 0) ++matched;
if (i >= p.size() && ++cnt[s[i - p.size()] - 'a'] > 0) --matched;
if (matched == p.size()) ans.push_back(i - p.size() + 1);
}
return ans;
}
};