LC93.复原IP地址:
class Solution:
def __init__(self):
self.res = []
def restoreIpAddresses(self, s: str) -> List[str]:
if len(s) > 12: return [] #最大长度不超过3*4=12
self.backtracking(s, 0, 0)
return self.res
def backtracking(self, s: str, startindex: int, pointsum: int) -> None:
if pointsum == 3:
if self.is_valid(s, startindex, len(s) - 1):
self.res.append(s[:])
return
for i in range(startindex, len(s)):
# [startindex, i]就是被截取的子串
if self.is_valid(s, startindex, i):
s = s[:i+1] + '.' + s[i+1:]
self.backtracking(s, i+2, pointsum+1) # 在填入.后,下一子串起始后移2位,pointsum + 1
s = s[:i+1] + s[i+2:] #回溯
else:
# 若当前被截取的子串大于255或者大于三位数,直接结束本层循环
break
def is_valid(self, s: str, start: int, end: int) -> bool:
if start > end:
return False
if s[start] == '0' and start != end:
return False #段位以0为开头的数字不合法
if not 0 <= int(s[start:end+1]) <= 255:
return False #段位如果大于255了不合法
return True
LC78.子集:
class Solution:
def __init__(self):
self.path = []
self.res = []
def subsets(self, nums: List[int]) -> List[List[int]]:
self.backtracking(nums, 0)
return self.res
def backtracking(self, nums, startindex) -> None:
# 收集子集,要先于终止判断
self.res.append(self.path[:])
if startindex >= len(nums):
return
# 单层递归逻辑
for i in range(startindex, len(nums)):
self.path.append(nums[i])
self.backtracking(nums, i+1)
self.path.pop() #回溯
很基础的回溯模板就可以解决。
LC90.子集II:
class Solution:
def __init__(self):
self.path = []
self.res = []
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
self.backtracking(nums, 0)
return self.res
def backtracking(self, nums, startindex) -> None:
nums.sort() #去重操作前需要先排序
self.res.append(self.path[:])
if startindex == len(nums):
return
for i in range(startindex, len(nums)):
if i > startindex and nums[i] == nums[i-1]: #去重操作
continue
self.path.append(nums[i])
self.backtracking(nums, i+1)
self.path.pop()
注意去重操作!要先对数组排序哦