Two methods: Both Time O(n^2)
- center expanding: Space O(n)
- two dp memo: Space O(n^2)
class Solution:def minCut(self, s: str) -> int:if not s or len(s) == 1:return 0n = len(s)dpCut = [i for i in range(n)]for i in range(n):j = 0while(i - j >= 0 and i + j < n and s[i-j] == s[i+j]):if i - j >0:dpCut[i+j] = min(dpCut[i+j], dpCut[i-j-1] + 1)else:dpCut[i+j] = 0j += 1j = 1while(i - j + 1>= 0 and i + j < n and s[i-j+1] == s[i+j]):if i - j + 1 > 0:dpCut[i+j] = min(dpCut[i+j], dpCut[i-j] + 1)else:dpCut[i+j] = 0j += 1return dpCut[-1]
class Solution:def minCut(self, s: str) -> int:if not s or len(s) == 1:return 0n = len(s)dpPal = [[False] * n for _ in range(n)]dpCut = [i for i in range(n)]for j in range(n):for i in range(j+1):if s[i] == s[j] and (i + 1 > j - 1 or dpPal[i+1][j-1]):dpPal[i][j] = Trueif i > 0:dpCut[j] = min(dpCut[j], dpCut[i-1] + 1)else:dpCut[j] = 0return dpCut[-1]
