--- title: '567. Permutation in String' description: Given two strings s1 and s2, return true if s2 contains a permutation of s1, or false otherwise icon: dot topics: - { name: "Hash Table", slug: "hash-table" } - { name: "Two Pointers", slug: "two-pointers" } - { name: "String", slug: "string" } - { name: "Sliding Window", slug: "sliding-window" } video: "UbyhOgBN834" issue: "https://github.com/prdlk/leetcode/issues/53" companies: - { name: "Meta", period: "Thirty Days", frequency: 63.8 } - { name: "Amazon", period: "Thirty Days", frequency: 48.9 } - { name: "tcs", period: "Three Months", frequency: 47.7 } - { name: "Bloomberg", period: "Three Months", frequency: 46.8 } - { name: "Microsoft", period: "Three Months", frequency: 33.4 } - { name: "Google", period: "Three Months", frequency: 17.3 } - { name: "Apple", period: "Six Months", frequency: 48.1 } sidebar: label: 'Permutation in String' badge: 'Medium' --- ### Example 1: - Input: `s1 = "ab", s2 = "eidbaooo"` - Output: `true` - Explanation: `s2` contains one permutation of `s1` ("ba"). ### Example 2: - Input: `s1 = "ab", s2 = "eidboaoo"` - Output: `false` ### Constraints: - `1 <= s1.length, s2.length <= 10^4` - `s1` and `s2` consist of lowercase English letters. ## Approach ```mermaid flowchart TD S(["checkInclusion(s1, s2)"]) --> G{"k = len(s1) > len(s2)?"} G -- yes --> X(["return False"]) G -- no --> I["need = Counter(s1), window = Counter()"] I --> L{"more (right, c) in s2?"} L -- no --> E(["return False"]) L -- yes --> A["window[c] += 1"] A --> B{"right >= k? — window is now longer than k"} B -- yes --> C["drop s2[right - k] from window, deleting the key at 0"] B -- no --> Q C --> Q{"window == need?"} Q -- yes --> R(["return True"]) Q -- no --> L ``` ## Solution ```py from collections import Counter class Solution: def checkInclusion(self, s1: str, s2: str) -> bool: k = len(s1) if k > len(s2): return False need = Counter(s1) window = Counter() for right, c in enumerate(s2): window[c] += 1 if right >= k: left_char = s2[right - k] window[left_char] -= 1 if window[left_char] == 0: del window[left_char] if window == need: return True return False ```