93.复原IP地址
还是需要多复习一下这道题和分割回文串
class Solution:
def __init__(self):
self.res = []
self.track = []
def restoreIpAddresses(self, s: str) -> List[str]:
self.backtrack(s, 0)
return self.res
# 回溯算法框架
def backtrack(self, s: str, start: int) -> None:
if start == len(s) and len(self.track) == 4:
# base case,走到叶子节点
# 即整个 s 被成功分割为合法的四部分,记下答案
self.res.append('.'.join(self.track))
for i in range(start, len(s)):
if not self.is_valid(s, start, i):
# s[start..i] 不是合法的 ip 数字,不能分割
continue
if len(self.track) >= 4:
# 已经分解成 4 部分了,不能再分解了
break
# s[start..i] 是一个合法的 ip 数字,可以进行分割
# 做选择,把 s[start..i] 放入路径列表中
self.track.append(s[start:i + 1])
# 进入回溯树的下一层,继续切分 s[i+1..]
self.backtrack(s, i + 1)
# 撤销选择
self.track.pop()
def is_valid(self, s, start, end):
if start > end:
return False
if s[start] == '0' and start != end: # 0开头的数字不合法
return False
num = 0
for i in range(start, end + 1):
if not s[i].isdigit(): # 遇到非数字字符不合法
return False
num = num * 10 + int(s[i])
if num > 255: # 如果大于255了不合法
return False
return True
78.子集
元素无重不可复选
class Solution:
def __init__(self):
self.track=[]
self.path=[]
def subsets(self, nums: List[int]) -> List[List[int]]:
self.backtrack(nums,0)
return self.path
def backtrack(self,nums,start):
self.path.append(self.track.copy())
for i in range(start,len(nums)):
self.track.append(nums[i])
self.backtrack(nums,i+1)
self.track.pop()
90.子集Ⅱ
元素有重不可复选,这道题要对数组进行排序,然后剪枝掉相邻元素相同的枝
class Solution:
def __init__(self):
self.track=[]
self.path=[]
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
nums.sort()
self.backtrack(0,nums)
return self.path
def backtrack(self,start,nums):
self.path.append(self.track.copy())
for i in range(start,len(nums)):
if i>start and nums[i]==nums[i-1]:
continue
self.track.append(nums[i])
self.backtrack(i+1,nums)
self.track.pop()