> For the complete documentation index, see [llms.txt](https://nataliekung.gitbook.io/ladder_code/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nataliekung.gitbook.io/ladder_code/amz-oa/find-all-anagrams-in-a-string.md).

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

分析

追击型指针

这里注意count是distinct 的字符长度

```
class Solution:
    def findAnagrams(self, s: str, p: str) -> List[int]:
        l=r=0
        mm = {i:0 for i in p}
        for i in p:
            mm[i] += 1
        ll = len(s)
        cnt = len(mm)
        res = []
        while r < ll:
            if s[r] in mm:
                mm[s[r]] -= 1
                if mm[s[r]] == 0:
                    cnt -= 1
            r += 1
            while not cnt: 
                if r - l == len(p):
                    res.append(l)
                if s[l] in mm:
                    mm[s[l]] += 1
                    if  mm[s[l]] == 1: cnt += 1
                
                l += 1
                
                
        return res
                 
```
