93.复原IP地址
回溯的时候,就将刚刚加入的分隔符.
删掉就可以了,pointNum也要-1。
最后就是在写一个判断段位是否是有效段位了。
主要考虑到如下三点:
- 段位以0为开头的数字不合法
- 段位里有非正整数字符不合法
- 段位如果大于255了不合法
-
class Solution: def restoreIpAddresses(self, s: str) -> List[str]: results = [] self.backtracking(s, 0, [], results) return results def backtracking(self, s, index, path, results): if index == len(s) and len(path) == 4: results.append('.'.join(path)) return if len(path) > 4: # 剪枝 return for i in range(index, min(index + 3, len(s))): if self.is_valid(s, index, i): sub = s[index:i+1] path.append(sub) self.backtracking(s, i+1, path, results) path.pop() def is_valid(self, s, start, end): if start > end: return False if s[start] == '0' and start != end: # 0开头的数字不合法 return False num = int(s[start:end+1]) return 0 <= num <= 255
78.子集
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
result=[]
path=[]
self.backtracking(nums,0,path,result)
return result
def backtracking(self,nums,startIndex,path,result):
result.append(path[:])#收集子集,要放在终止添加的上面,否则会漏掉自己
if startIndex >=len(nums):
return#终止条件可不加
for i in range(startIndex,len(nums)):
path.append(nums[i])
self.backtracking(nums, i + 1, path, result)
path.pop()
90.子集II
class Solution:#回溯,利用used数组去重
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
result=[]
path=[]
used=[False]*len(nums)
nums.sort()#去重需要排序
self.backtracking(nums,0,used,path,result)
return result
def backtracking(self,nums,startIndex,used,path,result):
result.append(path[:])
for i in range(startIndex,len(nums)):
# used[i - 1] == True,说明同一树枝 nums[i - 1] 使用过
# used[i - 1] == False,说明同一树层 nums[i - 1] 使用过
# 而我们要对同一树层使用过的元素进行跳过
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()