Problem statement
(Source) Given a string s, partition s such that every substring of the partition is a palindrome. Return the minimum cuts needed for a palindrome partitioning of s.
For example, given s = “aab”,
Return 1 since the palindrome partitioning [“aa”,”b”] could be produced using 1 cut.
Analysis
O(n2) time complexity, O(n2) space complexity.
Solution
def minCut(s):
"""
:type s: str
:rtype: int
"""
n = len(s)
# dp to construct "truth" table.
dp = [[False for i in xrange(n)] for j in xrange(n)]
for i in xrange(n):
dp[i][i] = True
for i in xrange(n - 1):
if s[i] == s[i + 1]:
dp[i][i + 1] = True
for length in xrange(3, n + 1):
for i in xrange(n - length + 1):
j = i + length - 1
if s[i] == s[j] and dp[i + 1][j - 1]:
dp[i][j] = True
# dp to count min-cuts.
cuts = [float('inf')] * n
cuts[0] = 0
for j in xrange(1, n):
if dp[0][j]:
cuts[j] = 0
else:
temp = float('inf')
for i in xrange(j):
if dp[i + 1][j] and temp > cuts[i] + 1:
temp = cuts[i] + 1
cuts[j] = temp
return cuts[-1]