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.
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.
class Solution:
def findAnagrams(self, s: str, p: str) -> List[int]:
counter = collections.Counter(p)
res = []
left = right = 0
t = collections.Counter()
while right < len(s):
t[s[right]] += 1
while t[s[right]] > counter[s[right]]:
t[s[left]] -= 1
left += 1
if right - left == len(p) - 1:
res.append(left)
right += 1
return res
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int[] counter = new int[26];
for (int i = 0; i < p.length(); ++i) {
++counter[p.charAt(i) - 'a'];
}
List<Integer> res = new ArrayList<>();
int left = 0, right = 0;
int[] t = new int[26];
while (right < s.length()) {
int i = s.charAt(right) - 'a';
++t[i];
while (t[i] > counter[i]) {
--t[s.charAt(left) - 'a'];
++left;
}
if (right - left == p.length() - 1) {
res.add(left);
}
++right;
}
return res;
}
}