Description
Given a string s, cut s into some substrings such that every substring is a palindrome.
Return the minimum cuts needed for a palindrome partitioning of s.
Examples
Example 1:
Input: “a”
Output: 0
Explanation: “a” is already a palindrome, no need to split.
Example 2:
Input: “aab”
Output: 1
Explanation: Split “aab” once, into “aa” and “b”, both palindrome.
Solution:
class Solution:
"""
@param s: A string
@return: An integer
"""
def minCut(self, s):
# write your code here
if s is None or len(s) < 2:
return 0
n = len(s)
cut = [0]*(n+1)
isPalin = [[False]*n for _ in range(n)]
for i in range(n):
isPalin[i][i] = True
if i+1 < n and s[i] == s[i+1]:
isPalin[i][i+1] = True
for i in range(n-1, -1, -1):
for d in range(2, n):
if i+d < n:
isPalin[i][i+d] = isPalin[i+1][i+d-1] and s[i] == s[i+d]
cut[0] = -1
for i in range(1, n+1):
cut[i] = i-1
for j in range(0, i):
if isPalin[j][i-1]:
cut[i] = min(cut[i], cut[j]+1)
return cut[n]