抽象成回溯树,树枝上是每次从头部穷举切分出的子串,节点上是待切分的剩余字符串 【从头开始每次往后加一】
 
class  Solution : def  partition ( self,  s:  str )  - >  List[ List[ str ] ] : result =  [ ] self. backtrack( s, 0 , [ ] , result) return  resultdef  backtrack ( self,  s,  start,  temp_list,  result) : if  start ==  len ( s) : result. append( temp_list[ : ] ) return  for  i in  range ( start, len ( s) ) : if  self. huiwenchuan( s,  start,  i) : temp_list. append( s[ start: i +  1 ] ) self. backtrack( s,  i +  1 ,  temp_list,  result) temp_list. pop( ) def  huiwenchuan ( self,  s,  start1,  end1) : start =  start1end =  end1while  start <  end: if  s[ start]  !=  s[ end] : return  False start +=  1 end -=  1 return  True 那么既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开始! 
 
class  Solution : def  subsets ( self,  nums:  List[ int ] )  - >  List[ List[ int ] ] : result =  [ ] result. append( [ ] ) self. backtrack( nums,  [ ] ,  0 ,  result) return  resultdef  backtrack ( self,  nums,  temp_list,  start_index,  result) : if  len ( temp_list)  >=  1 : result. append( temp_list[ : ] ) for  i in  range ( start_index,  len ( nums) ) : temp_list. append( nums[ i] ) self. backtrack( nums,  temp_list,  i +  1 ,  result) temp_list. pop( ) 
 
class  Solution : def  subsetsWithDup ( self,  nums:  List[ int ] )  - >  List[ List[ int ] ] : result =  [ ] result. append( [ ] ) nums. sort( )    self. backtrack( nums,  [ ] ,  0 ,  result) return  resultdef  backtrack ( self,  nums,  temp_list,  start_index,  result) : if  len ( temp_list)  >=  1 : if  temp_list not  in  result: result. append( temp_list[ : ] ) for  i in  range ( start_index,  len ( nums) ) : temp_list. append( nums[ i] ) self. backtrack( nums,  temp_list,  i +  1 ,  result) temp_list. pop( ) class  Solution : def  subsetsWithDup ( self,  nums) : result =  [ ] path =  [ ] nums. sort( )   self. backtracking( nums,  0 ,  path,  result) return  resultdef  backtracking ( self,  nums,  startIndex,  path,  result) : result. append( path[ : ] )   uset =  set ( ) for  i in  range ( startIndex,  len ( nums) ) : if  nums[ i]  in  uset: continue uset. add( nums[ i] ) path. append( nums[ i] ) self. backtracking( nums,  i +  1 ,  path,  result) path. pop( ) 
class  Solution : def  subsetsWithDup ( self,  nums) : result =  [ ] path =  [ ] used =  [ False ]  *  len ( nums) nums. sort( )   self. backtracking( nums,  0 ,  used,  path,  result) return  resultdef  backtracking ( self,  nums,  startIndex,  used,  path,  result) : result. append( path[ : ] )   for  i in  range ( startIndex,  len ( nums) ) : if  i >  0  and  nums[ i]  ==  nums[ i -  1 ]  and  not  used[ i -  1 ] : continue path. append( nums[ i] ) used[ i]  =  True self. backtracking( nums,  i +  1 ,  used,  path,  result) used[ i]  =  False path. pop( )