class Solution :
def partition ( self, s: str ) - > List[ List[ str ] ] :
def fromCenterJudge ( s, left, right, dp) :
while left>= 0 and right< len ( s) and s[ left] == s[ right] :
dp[ left] [ right] = True
left -= 1
right += 1
def dfs ( res, path, s, start, dp) :
if start== len ( s) :
res. append( path. copy( ) )
return
for i in range ( start, len ( s) ) :
if not dp[ start] [ i] :
continue
path. append( s[ start: i+ 1 ] )
dfs( res, path, s, i+ 1 , dp)
path. pop( )
res = [ ]
path = [ ]
dp = [ [ False ] * len ( s) for _ in range ( len ( s) ) ]
for i in range ( len ( s) ) :
fromCenterJudge( s, i, i, dp)
fromCenterJudge( s, i, i+ 1 , dp)
start = 0
dfs( res, path, s, start, dp)
return res
class Solution :
def minCut ( self, s: str ) - > int :
def fromCenterJudge ( s, left, right, dp) :
while left>= 0 and right< len ( s) and s[ left] == s[ right] :
dp[ left] [ right] = True
left -= 1
right += 1
dp = [ [ False ] * len ( s) for _ in range ( len ( s) ) ]
for i in range ( len ( s) ) :
fromCenterJudge( s, i, i, dp)
fromCenterJudge( s, i, i+ 1 , dp)
res = [ 0 ] * len ( s)
for j in range ( 1 , len ( s) ) :
if dp[ 0 ] [ j] :
res[ j] = 0
else :
res[ j] = res[ j- 1 ] + 1
for i in range ( 1 , j) :
if dp[ i] [ j] :
res[ j] = min ( res[ j] , res[ i- 1 ] + 1 )
return res[ - 1 ]