# 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".

# Solution

Approach 1: sliding window.

# Code (Python)

Approach 1:

class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
        result = []
        freqs_in_p = [0] * 26
        for letter in p:
            freqs_in_p[ord(letter) - ord('a')] += 1
        freqs_in_p = tuple(freqs_in_p)
        freqs = [0] * 26
        for r in range(len(s)):
            freqs[ord(s[r]) - ord('a')] += 1
            if r >= len(p):
                freqs[ord(s[r-len(p)]) - ord('a')] -= 1
            if tuple(freqs) == freqs_in_p:
                result.append(r - len(p) + 1)

        return result

# Code (C++)

Approach 1:

Approach 2: