93. Restore IP Addresses
题目做法与回文串类似
终止条件是跳过添加.
的数量判断
写代码时遇到了一个坑点,代码随想录中提供的代码isVaild()
函数是传入原数组和切割的首尾index
,我则是直接Python切片
因为递归时和以往不同,下一轮的startIndex
为i + 2
,所以有可能出现startIndex
越界的情况,导致切割出的为[]
。
源代码通过if start > end
判断,我这里需要判断s_cut
是否等于[]
class Solution:
def __init__(self):
self.res = []
def isVaild(self, s_cut):
if s_cut == []: # 因为startIndex每次+2,所以有可能出现超过len(s_list)的情况,s_cut为[]
return False
if s_cut[0] == '0' and len(s_cut) > 1:
return False
for char in s_cut:
if char < '0' or char > '9':
return False
if int(''.join(s_cut)) > 255:
return False
return True
def backtracking(self, s_list, startIndex, pointNum):
# 终止条件:已经有三个点
if pointNum == 3:
if self.isVaild(s_list[startIndex:]): # 第四段是否有效
self.res.append(''.join(s_list))
return
for i in range(startIndex, len(s_list)):
if self.isVaild(s_list[startIndex: i + 1]): # 分割出的这段有效
s_list.insert(i + 1, '.')
pointNum += 1
self.backtracking(s_list, i + 2, pointNum) # 递归,多了一个'.',所以i+2
pointNum -= 1 # 回溯
s_list.pop(i + 1)
else:
break # 不合法,直接结束本层循环
def restoreIpAddresses(self, s: str) -> List[str]:
self.backtracking(list(s), 0, 0)
return self.res
78. Subsets
与之前的组合问题不同,自己问题不是在叶子节点收集而是在所有节点收集
class Solution:
def __init__(self):
self.path = []
self.res = []
def backtracking(self, nums, startIndex):
self.res.append(self.path.copy()) # 每一个节点都要收集,要放在终止添加的上面,否则会漏掉自己
# 终止条件
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() # 回溯
def subsets(self, nums: List[int]) -> List[List[int]]:
self.backtracking(nums, 0)
return self.res
90. Subsets II
这题是78和40的结合
class Solution:
def __init__(self):
self.path = []
self.res = []
def backtracking(self, nums, startIndex, used):
self.res.append(self.path.copy())
if startIndex >= len(nums):
return
for i in range(startIndex, len(nums)):
if nums[i] == nums[i - 1] and i > 0 and used[i - 1] == False:
continue
self.path.append(nums[i])
used[i] = True
self.backtracking(nums, i + 1, used)
used[i] = False
self.path.pop()
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
nums.sort()
used = [False] * len(nums)
self.backtracking(nums, 0, used)
return self.res