93.复原IP地址
1.确定结束条件:if startIndex==len(s) and len(path)==4:
res.append('.'.join(path))
return(是否已经处理完整个字符串s
并且路径path
中包含了4个段(即IP地址的4个部分)。如果这两个条件都满足,那么就将当前的路径作为一个合法的IP地址添加到结果列表res
中。)2.在取到第四位时做剪枝。
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
#判断子串是否合法
#段位以0为开头的数字不合法
#段位里有非正整数字符不合法
#段位如果大于255了不合法
def isvaild(segment):
if len(segment)>3:
return False
if int(segment[0])==0 and len(segment)>1:
return False
if not 0<=int(segment)<=255:
return False
return True
def backtrack(startIndex,path):
#递归终止条件
if startIndex==len(s) and len(path)==4:
res.append('.'.join(path))
return
if len(path)>4: #剪枝
return
for i in range(startIndex,len(s)):
#判断是否存在符合条件的整数
if isvaild(s[startIndex:i+1]):
path.append(s[startIndex:i+1])
backtrack(i+1,path)
path.pop()
res=[]
backtrack(0,[])
return res
78.子集
1.组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!
2.是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开始!
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
def backtracking(startIndex,path):
res.append(path[:]) # 收集子集,要放在终止添加的上面,否则会漏掉自己
for i in range(startIndex,len(nums)):
path.append(nums[i])
backtracking(i+1,path)
path.pop()
res=[]
backtracking(0,[])
return res
90.子集II
要去重就要先对集合排序。
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
nums.sort()
def backtracking(startIndex,path):
res.append(path[:]) #收集子集
if startIndex==len(nums):
return
for i in range(startIndex,len(nums)):
if i>startIndex and nums[i]==nums[i-1]:
continue
path.append(nums[i])
backtracking(i+1,path)
path.pop()
res=[]
backtracking(0,[])
return res