Leetcode: 132. Palindrome Partitioning II

Problem Statement

from typing import List


class Solution:
    def minCut(self, s: str) -> int:
        N = len(s)

        is_palindrome = [[False] * N for _ in range(N)]
        for k in range(N):
            i = k
            j = k
            while 0 <= i and j < N and s[i] == s[j] and is_palindrome[i][j] == False:
                is_palindrome[i][j] = True
                i -= 1
                j += 1
        for k in range(N - 1):
            if s[k] != s[k + 1]:
                continue
            i = k
            j = k + 1
            while 0 <= i and j < N and s[i] == s[j] and is_palindrome[i][j] == False:
                is_palindrome[i][j] = True
                i -= 1
                j += 1

        dp = [float("inf")] * N
        for i in range(N - 1, -1, -1):
            for j in range(i, N):
                if not is_palindrome[i][j]:
                    continue
                if j + 1 == N:
                    dp[i] = min(dp[i], 0)
                else:
                    dp[i] = min(dp[i], 1 + dp[j + 1])
        return dp[0]


assert Solution().minCut("aab") == 1
assert Solution().minCut("a") == 0
assert Solution().minCut("ab") == 1