Two methods: Both Time O(n^2)

    1. center expanding: Space O(n)
    2. two dp memo: Space O(n^2)
    1. class Solution:
    2. def minCut(self, s: str) -> int:
    3. if not s or len(s) == 1:
    4. return 0
    5. n = len(s)
    6. dpCut = [i for i in range(n)]
    7. for i in range(n):
    8. j = 0
    9. while(i - j >= 0 and i + j < n and s[i-j] == s[i+j]):
    10. if i - j >0:
    11. dpCut[i+j] = min(dpCut[i+j], dpCut[i-j-1] + 1)
    12. else:
    13. dpCut[i+j] = 0
    14. j += 1
    15. j = 1
    16. while(i - j + 1>= 0 and i + j < n and s[i-j+1] == s[i+j]):
    17. if i - j + 1 > 0:
    18. dpCut[i+j] = min(dpCut[i+j], dpCut[i-j] + 1)
    19. else:
    20. dpCut[i+j] = 0
    21. j += 1
    22. return dpCut[-1]
    1. class Solution:
    2. def minCut(self, s: str) -> int:
    3. if not s or len(s) == 1:
    4. return 0
    5. n = len(s)
    6. dpPal = [[False] * n for _ in range(n)]
    7. dpCut = [i for i in range(n)]
    8. for j in range(n):
    9. for i in range(j+1):
    10. if s[i] == s[j] and (i + 1 > j - 1 or dpPal[i+1][j-1]):
    11. dpPal[i][j] = True
    12. if i > 0:
    13. dpCut[j] = min(dpCut[j], dpCut[i-1] + 1)
    14. else:
    15. dpCut[j] = 0
    16. return dpCut[-1]