93. 复原 IP 地址
class Solution:
def isValid(self,s):
# print(s)
# 以零开头
if len(s)>1 and s[:1] == "0":
return False
# 大于255
if int(s)>255:
return False
return True
def backtracking(self, s, startIndex, res, 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 self.isValid(s[startIndex:i+1]):
path.append(s[startIndex:i+1])
self.backtracking(s, i+1, res, path)
path.pop()
def restoreIpAddresses(self, s: str) -> List[str]:
res = []
self.backtracking(s,0,res,[])
return res
78.子集
class Solution:
def backtracking(self, nums, path, res,startIndex):
res.append(path[:])
if startIndex >= len(nums):
return
for i in range(startIndex,len(nums)):
path.append(nums[i])
self.backtracking(nums, path,res, i+1)
path.pop()
def subsets(self, nums: List[int]) -> List[List[int]]:
res = []
self.backtracking(nums,[], res,0)
return res
90.子集II
同一层不能有重复的做法,used数组再次出现。
class Solution:
def backtracking(self, nums, path, res, startIndex, used):
res.append(path[:])
if startIndex >= len(nums):
return
for i in range(startIndex, len(nums)):
if i > startIndex and nums[i] == nums[i-1] and not used[i-1]:
continue
path.append(nums[i])
used[i] == True
self.backtracking(nums,path,res,i+1,used)
used[i] == False
path.pop()
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
nums.sort()
res = [ ]
used = [False] * len(nums)
self.backtracking(nums,[],res, 0, used)
return res