93 复原IP地址
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
思路
def isValid(s,start,end):if start>end:return Falseif s[start]==0 and start!=end:return False num=int(s[start:end+1])return 0<=num<=255
def backtracking(s,index,path,result):if index==len(s) and len(path)==4: #s遍历完并且拆分的部分正好有4个result.append('.'.join(path))returnif len(path)>4: # 分割超过4个直接省略return for i in range(index,min(index+3,len(s))):if isValid(s,index,i):sub=s[index:i+1]path.append(sub)backtracking(s,index+1,path,result)path.pop()
def restoreIPAdresses(s:'str')->'List[str]':result=[]backtracking(s,0,[],result):return result
78 子集
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的
子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
思路
def backtracking(nums,startIndex,path,result):result.append(path[:]) #每次调用backtracking函数,先把上一次path里的内容存储起来for i in range(startIndex,len(nums)):path.append(nums[i])backtracking(nums,i+1,path,result)path.pop()
def subsets(nums:list)->'List[List[int]]':result=[]backtracking(nums,0,[],result)return result
90 子集II
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的
子集
(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
思路
def backtracking(nums,startIndex,path,result):result.append(path[:])uset=set()for i in range(startIndex,len(nums)):if nums[i] in uset():continueuset.add(nums[i])path.append(nums[i])backtracking(nums,i+1,path,result)path.pop()
def subsetWithDup(nums):result=[]nums.sort() #每次递归,就会有一个新的set集合,乱序不能保证 4441 1444 backtracking(nums,0,[],result)return result
- 对于44144不排序,441 144 就都会保留,第一层set加入4,1;第二层set加入4;第三层set加入1、4。
- 因此414不会再第一层中出现,只能在第二层层出现