93.复原IP地址
题目:给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
题目链接:93. 复原 IP 地址
class Solution:
def __init__(self):
self.result = []
def restoreIpAddresses(self, s: str) -> List[str]:
self.result.clear()
if len(s) > 12: # 超过12就不是ip地址了
return []
self.backtracking(s, 0, 0)
return self.result
def backtracking(self, s:str, start_index: int, point_num: int) -> None:
if point_num == 3:
if self.is_valid(s, start_index, len(s) - 1):
self.result.append(s[:])
return
for i in range(start_index, len(s)):
if self.is_valid(s, start_index, i):
s = s[:i+1] + '.' + s[i+1:] # [start_index, i]就是被截取的子串
self.backtracking(s, i+2, point_num+1) # 在填入.后,下一子串起始后移2位
s = s[:i+1] + s[i+2:] # 回溯
else:
break
def is_valid(self, s: str, start: int, end: int) -> bool:
if start > end:
return False
if s[start] == '0' and start != end: # 段位以0为开头的数字不合法
return False
if not 0 <= int(s[start: end + 1]) <= 255: # 段位如果大于255了不合法
return False
return True
78.子集
题目:给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
题目链接: 78. 子集
class Solution:
def __init__(self):
self.path: List[int] = []
self.paths: List[List[int]] = []
def subsets(self, nums: List[int]) -> List[List[int]]:
self.path.clear()
self.paths.clear()
self.backtracking(nums, 0)
return self.paths
def backtracking(self, nums: List[int], start_index: int) -> None:
self.paths.append(self.path[:]) # 收集子集,要放在终止添加的上面,否则会漏掉自己
if start_index == len(nums):
return
for i in range(start_index, len(nums)):
self.path.append(nums[i])
self.backtracking(nums, i + 1)
self.path.pop()
90.子集II
题目:给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
题目链接:90. 子集 II
class Solution:
def __init__(self):
self.path = []
self.paths = []
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
self.path.clear()
self.paths.clear()
nums.sort()
self.backtracking(nums, 0)
return self.paths
def backtracking(self, nums: List[int], start_index: int) -> None:
self.paths.append(self.path[:])
if start_index == len(nums):
return
for i in range(start_index, len(nums)):
if i > start_index and nums[i] == nums[i - 1]:
continue # 当前后元素值相同时,跳入下一个循环,去重
self.path.append(nums[i])
self.backtracking(nums, i + 1)
self.path.pop() # 回溯