131.分割回文串
此題思維和前幾題不一樣,思維容量更大,主要在於返回的時候,還是會取值。
運行代碼:
class Solution:
def partition(self, s: str) -> List[List[str]]:
result=[]
tt=[]
def backtrack(s,index):
if len(s)==index:
result.append(tt[:])
return
for i in range(index,len(s)):
temp=s[index:i+1]
if temp==temp[::-1]:
tt.append(temp)
backtrack(s,i+1)
tt.pop()
else:
continue
backtrack(s,0)
return result
注意點一:
注意點2---tt.pop()用法:
93.复原IP地址 (其實把字符串回溯套路全部寫出來,然後進行過濾)
本題是在上題131基礎上,進行改變而得出的一道題。從上題可以知道,很多子值已經取到。
本題難點一--------------->對字符串進行比較:
下圖兩種方法:
本題難點二--------------->對字符串進行比較:
運行代碼:
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
ff=[]
result=[]
def backtrack(s,index):
if len(ff)==4:
if index==len(s):
result.append(".".join(ff[:]))
return
for i in range(index,len(s)):
temp=s[index:i+1]
# if int(s[index])!=0 and int(temp)<=255 :
if (int(s[index]) != 0 and 0<int(temp) <= 255) or temp=="0":
ff.append(temp)
backtrack(s,i+1)
ff.pop()
else:
continue
backtrack(s,0)
return result
78.子集
梳理一下整體邏輯:
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
ff=[]
result=[]
def backtrack(nums,index):
result.append(ff[:])
for i in range(index,len(nums)):
ff.append(nums[i])
backtrack(nums,i+1)
ff.pop()
backtrack(nums,0)
return result
90.子集II
和40.組合總和2一樣的套路。重要的是理解:
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
result=[]
ff=[]
def backtrace(nums,index):
nums.sort()
result.append(ff[:])
for i in range(index,len(nums)):
if i>index and nums[i-1]==nums[i]:
continue
ff.append(nums[i])
backtrace(nums,i+1)
ff.pop()
backtrace(nums,0)
return result