Tech for good

[Neetcode/Sliding Window] Permutation in String ๋ณธ๋ฌธ

IT/Computer Science

[Neetcode/Sliding Window] Permutation in String

Diana Kang 2025. 3. 3. 02:00

https://neetcode.io/problems/permutation-string

 

NeetCode

 

neetcode.io

๐Ÿ›  ํ•ด๊ฒฐ ์ „๋žต

์ด ๋ฌธ์ œ๋Š” ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ(Sliding Window) + ํ•ด์‹œ๋งต(๋”•์…”๋„ˆ๋ฆฌ) ํ™œ์šฉ์œผ๋กœ O(n)์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. s1์˜ ๋ชจ๋“  ๋ฌธ์ž ๋นˆ๋„ ์ˆ˜๋ฅผ ๊ณ„์‚ฐ (char_count_s1).
  2. s2์—์„œ ๊ธธ์ด๊ฐ€ len(s1)์ธ ์œˆ๋„์šฐ๋ฅผ ์ด๋™ํ•˜๋ฉฐ ๊ฐ™์€ ๋นˆ๋„ ์ˆ˜๋ฅผ ๊ฐ–๋Š”์ง€ ๋น„๊ต (char_count_window).
  3. ์ฒซ ๋ฒˆ์งธ ์œˆ๋„์šฐ ํ™•์ธ ํ›„ ํ•œ ์นธ์”ฉ ์ด๋™ํ•˜๋ฉฐ ๊ฒ€์‚ฌ
  4. ๋งŒ์•ฝ ๋™์ผํ•œ ๋นˆ๋„ ์ˆ˜๋ฅผ ๊ฐ€์ง€๋Š” ๊ตฌ๊ฐ„์ด ์žˆ๋‹ค๋ฉด True ๋ฐ˜ํ™˜.
class Solution:
    def checkInclusion(self, s1: str, s2: str) -> bool:
        n, m = len(s1), len(s2)
        
        if n > m:  # s1์ด s2๋ณด๋‹ค ๊ธธ๋ฉด ๋ถˆ๊ฐ€๋Šฅ
            return False
        
        # 1๏ธโƒฃ s1์˜ ๋ฌธ์ž ๋นˆ๋„์ˆ˜ ๊ณ„์‚ฐ
        char_count_s1 = Counter(s1)
        
        # 2๏ธโƒฃ s2์—์„œ ์ฒ˜์Œ `n` ๊ธธ์ด์˜ ์œˆ๋„์šฐ ๋ฌธ์ž ๋นˆ๋„์ˆ˜ ๊ณ„์‚ฐ
        char_count_window = Counter(s2[:n])

        # 3๏ธโƒฃ ์ฒซ ๋ฒˆ์งธ ์œˆ๋„์šฐ๊ฐ€ ์ •๋‹ต์ธ์ง€ ํ™•์ธ
        if char_count_window == char_count_s1:
            return True

        # 4๏ธโƒฃ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ์ด๋™
        for i in range(n, m):
            # ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๋ฌธ์ž => ์ƒˆ๋กœ์šด ๋ฌธ์ž ์ถ”๊ฐ€
            char_count_window[s2[i]] += 1
            # ์ œ๊ฑฐ๋˜๋Š” ๋ฌธ์ž => ์™ผ์ชฝ ๋ ๋ฌธ์ž ์ œ๊ฑฐ
            char_count_window[s2[i - n]] -= 1

            # ํ˜„์žฌ ์œˆ๋„์šฐ ๋นˆ๋„์ˆ˜์™€ s1 ๋นˆ๋„์ˆ˜ ๋น„๊ต
            if char_count_window == char_count_s1:
                return True
        
        return False

โณ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

  • ์ดˆ๊ธฐ Counter(s1), Counter(s2[:n]) ๊ณ„์‚ฐ: O(n)
  • ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ์ด๋™: O(m - n)
  • ์ด ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) + O(m - n) = O(m)

๐Ÿ’ก ์ฆ‰, O(m)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ!