93.复原IP地址
题目链接: 93.复原IP地址
文档讲解: 代码随想录
题目难度:中等
思路: 类似于分割回文串,区别在于终止条件不同
时间复杂度:O(34);空间复杂度:O(n)
下面展示 代码
:
class Solution:
def isValid(self, s, start, end):
if start > end:
return False
if int(s[start]) == 0 and start != end:
return False
num = int(s[start:end+1])
return 0 <= num <= 255
def backtracking(self, s, start, path, res):
# 终止条件
if start == len(s) and len(path) == 4:
res.append('.'.join(path))
return
# 剪枝
if len(path) > 4:
return
# 回溯
for i in range(start, len(s)):
if self.isValid(s, start, i):
path.append(s[start:i+1])
self.backtracking(s, i+1, path, res)
path.pop()
def restoreIpAddresses(self, s: str) -> List[str]:
res = []
self.backtracking(s, 0, [], res)
return res
78.子集
题目链接: [78.子集](https://leetcode.cn/problems/subsets/)
文档讲解: 代码随想录
题目难度:中等
思路: 注意空集也是子集,因此res.append(path[:])需要放在最开头,不是在终止条件后
时间复杂度:O(n * 2n);空间复杂度:O(n)
代码
如下
class Solution:
def backtracking(self, nums, start, path, res):
res.append(path[:])
if start == len(nums):
return
for i in range(start, len(nums)):
path.append(nums[i])
self.backtracking(nums, i +1, path, res)
path.pop()
def subsets(self, nums: List[int]) -> List[List[int]]:
if len(nums) == 0:
return [[]]
res = []
self.backtracking(nums, 0, [], res)
return res
90.子集II
题目链接: 90.子集II
文档讲解: 代码随想录
题目难度:中等
思路: 和上一题类似,但是需要考虑同一树层不能有相同值出现
时间复杂度:O(n*2n);空间复杂度:O(n)
代码
如下
class Solution:
def backtracking(self, nums, start, path, res):
res.append(path[:]) # 空集在此处加入
if start == len(nums):
return
for i in range(start, len(nums)):
if i > start and nums[i] == nums[i - 1]: # 同一树层
continue
path.append(nums[i])
self.backtracking(nums, i + 1, path, res)
path.pop()
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
if len(nums) == 0:
return [[]]
res = []
# 如果使用nums[i] == nums[i - 1]来判断的话,应该先给nums排序
nums.sort()
self.backtracking(nums, 0, [], res)
return res