93.复原IP地址
需要一个函数判断数是否处于0 - 255且超过一位数的第一个不为零
递归中的易错点在于 递归的start的处理
class Solution:
def __init__(self):
self.res = []
self.pointNum = 0
def isValid(self, s: str, start: int, end: int) -> bool:
if start > end:
return False
if s[start] == "0" and start != end:
return False
if not 0 <= int(s[start: end + 1]) <= 255:
return False
return True
def backtracking(self, s: str, start: int):
if self.pointNum == 3:
if self.isValid(s, start, len(s) - 1):
self.res.append(s[:])
return
#check
for i in range(start, len(s)):
if self.isValid(s, start, i):
s = s[:i+1] + "." + s[i+1:]
self.pointNum += 1
# (i + 2) :因为最后是个点
self.backtracking(s, i + 2)
s = s[:i+1] + s[i+2:]
self.pointNum -= 1
def restoreIpAddresses(self, s: str) -> List[str]:
self.backtracking(s, 0)
return self.res
78.子集
class Solution:
def __init__(self):
self.path = []
self.res = []
def backtracking(self, nums: List[int], start: int):
self.res.append(self.path[:])
for i in range(start, len(nums)):
self.path.append(nums[i])
self.backtracking(nums, i + 1)
self.path.pop()
def subsets(self, nums: List[int]) -> List[List[int]]:
if not nums:
return []
self.backtracking(nums, 0)
return self.res
90.子集II
class Solution:
def __init__(self):
self.path = []
self.res = []
def backtracking(self, nums: List[int], start: int):
self.res.append(self.path[:])
for i in range(start, len(nums)):
if i > start and nums[i] == nums[i - 1]:
continue
self.path.append(nums[i])
self.backtracking(nums, i + 1)
self.path.pop()
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
if not nums:
return []
nums.sort()
self.backtracking(nums, 0)
return self.res