# code tpl {%hackmd theme-dark %} s = "cbaebabacd", p = "abc" 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. 1. find all anagram in s 2. abc bca acb 0: cba 6: bac -> [0, 6], [6, 0] slide window "[cba]ebabacd" -> tuple (1, 1, 1)26 # (a, b, c) -> same with p (1, 1, 1), "c[bae]babacd" -c, +e tuple (1, 1, 0...)26 -> not match "cb[aeb]abacd" -b, +b tuple (1, 1, 0...)26 -> not match .. "cbaeba[bac]d", tuple (1, 1, 1...) -> same with p (1, 1, 1) , push 6 return ans [0, 6] ```python= class Solution(object): def findAnagrams(self, s, p): """ :type s: str :type p: str :rtype: List[int] """ def getIdx(w): return ord(w) - 'a' pattern = [0]*26 for w in p: pattern[getIdx(w)] += 1 pattern = tuple(pattern) # (1, 1, 1) lenP = len(p) ans = [] curPattern = [0]*26 for w in s[:lenP]: curPattern[getIdx(w)] += 1 if tuple(curPattern) == pattern: ans.append(0) "[(c-)ba](e+)babacd" "cbaebab[acd]" for i in range(lenP, len(s)): newW = s[i] # e oldW = s[i-lenP] # c curPattern[getIdx(newW)] += 1 curPattern[getIdx(oldW)] -= 1 # (1, 1, 0...) if tuple(curPattern) == pattern: ans.append(i) return ans # N: num of S # M: num of P # TC: O(N) # SC: O(1) ``` ###### tags: `mock interview` `面試`