题目描述:
方法一:动态规划
class Solution: def minCut(self, s: str) -> int: min_s = list(range(len(s))) n = len(s) dp = [[False] * n for _ in range(n)] for i in range(n): for j in range(i+1): if s[i] == s[j] and (i - j < 2 or dp[j + 1][i - 1]): dp[j][i] = True # 说明不用分割 if j == 0: min_s[i] = 0 else: min_s[i] = min(min_s[i], min_s[j - 1] + 1) return min_s[-1]
方法二:递归
import functools class Solution: @functools.lru_cache(None) def minCut(self, s: str) -> int: if s == s[::-1]: return 0 ans = float("inf") for i in range(1, len(s) + 1): if s[:i] == s[:i][::-1]: ans = min(self.minCut(s[i:]) + 1, ans) return ans