93. 复原IP地址
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
def is_valid(subsubset):
if int(subsubset) < 0 or int(subsubset) > 255:
return False
if subsubset[0] == '0' and subsubset != '0':
return False
if subsubset == '00' or subsubset == '000':
return Flase
else:
return True
def back_tracking(result, subset, s, start_index):
if start_index >= len(s):
if len(subset) == 4:
result.append('.'.join(subset.copy()))
return
for i in range(start_index, len(s)):
if i == start_index:
subsubset = s[i]
elif i > start_index:
subsubset = s[start_index:i + 1]
if is_valid(subsubset):
subset.append(subsubset)
else:
continue
back_tracking(result, subset, s, i + 1)
subset.pop()
result = []
subset = []
start_index = 0
back_tracking(result, subset, s, start_index)
return result
和上一题做的分割回文串类似,都需要切割字串,这里需要判断是否是有效的ip地址,注意不能有先导0:即不能有00 或者000出现,但是0是可以的。
78. 子集
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
def back_tracking(result, subset, nums, start_index):
result.append(subset.copy())
for i in range(start_index, len(nums)):
subset.append(nums[i])
back_tracking(result, subset, nums, i + 1)
subset.pop()
result = []
subset = []
start_index = 0
back_tracking(result, subset, nums, start_index)
# result += []
return result
和组合类似,只不过这次搜集所有的节点
90. 子集Ⅱ
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
def back_tracking(result, nums, subset, start_index):
result.append(subset.copy())
for i in range(start_index, len(nums)):
if i > start_index and nums[i] == nums[i - 1]:
continue
subset.append(nums[i])
back_tracking(result, nums, subset, i + 1)
subset.pop()
result = []
subset = []
start_index = 0
nums.sort()
back_tracking(result, nums, subset, 0)
return result
加上去重的逻辑