leetcode 132. Palindrome Partitioning II

Alpha, Orderly·2024년 9월 14일
0

leetcode

목록 보기
110/140

문제

Given a string s, 
partition s such that every substring of the partition is a palindrome.
Return the minimum cuts needed for a palindrome partitioning of s.
  • 주어진 문자열 s 에 대해 이를 여러 문자열로 분리한다고 가정한다.
  • 모든 분리된 부분 문자열이 회문이 되게할때, 최소한으로 분리할수 있는 갯수를 구하라

예시

'aab'
>> [a] | [a] | [b] 로 나뉘어도 3개의 회문으로 구성
>> [aa] | [b] 로 나뉘어도 2개의 회문으로 구성
- 최소한으로 나누는 횟수는 1회이다.
- 정답 : 1

제한

  • 1<=s.length<=20001 <= s.length <= 2000
  • 문자열 s는 영어 소문자로만 구성된다.

풀이

  • 특정 index로 부터 시작할때 최소한의 cut의 갯수를 구한다.
class Solution:
    def minCut(self, s: str) -> int:
        N = len(s)
        dp = [[False] * N for _ in range(N)]

		# 미리 Palindrom 여부를 계산한다.
        for i in range(N - 1, -1, -1):
            dp[i][i] = True
            for j in range(i + 1, N):
                if s[i] == s[j] and (j - i == 1 or dp[i + 1][j - 1]):
                    dp[i][j] = True

        cache = {}

		# startIndex로부터 시작한 문자열이 얼마나 적은 cut으로 회문을 만들수 있는지 구한다.
        def check(startIndex: int) -> int:
            if startIndex == N:
                return -1

            if startIndex in cache:
                return cache[startIndex]

            mincut = N

			# startIndex로부터 시작한 문자열이 회문인지 확인하고 cut의 갯수를 체크한다.
            for end in range(startIndex, N):
                if dp[startIndex][end]:
                    mincut = min(mincut, 1 + check(end + 1))

            cache[startIndex] = mincut

            return mincut

        return check(0)
profile
만능 컴덕후 겸 번지 팬

0개의 댓글