93. 复原 IP 地址:
代码思路
老套路,两个for加剪枝。
但是剪枝的逻辑有点复杂,看看可不可以优化一下?
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
res = []
def bt(node_index, ans_list):
if len("".join(ans_list)) == len(s) and len(ans_list) == 4:
res.append(".".join(ans_list))
return
for i in range(node_index+1, len(s)):
if len(s[node_index+1:i+1]) > 3 or len(s[node_index+1:i+1]) <=0:
break
if len(ans_list) > 3:
break
if int(s[node_index+1:i+1]) > 255 or int(s[node_index+1:i+1]) < 0:
break
if s[node_index+1:i+1][0] == "0" and len(s[node_index+1:i+1]) > 1:
break
temp_anslis = ans_list+[s[node_index+1:i+1]]
bt(i, temp_anslis)
for i in range(len(s)):
if int(s[:i+1]) > 255 or int(s[:i+1]) < 0:
continue
if s[:i+1][0] == "0" and len(s[:i+1]) > 1:
continue
bt(i, [s[:i+1]])
return res
78. 子集:
代码思路
一样,递归老套路,两个for,参数是nodeindex和anslist
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
res = [[]]
def bt(node_index, ans_list):
res.append(ans_list)
if len(ans_list) == len(nums):
return
for i in range(node_index+1, len(nums)):
temp_ans_list = ans_list + [nums[i]]
bt(i, temp_ans_list)
for i in range(len(nums)):
bt(i, [nums[i]])
return res
90. 子集 II:
代码思路
老套路,但是和子集那题的区别是这题要跳过一些重复结果。
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
res = [[]]
sort_nums = sorted(nums)
def bt(node_index, ans_list):
res.append(ans_list)
if len(ans_list) == len(sort_nums):
return
for i in range(node_index+1, len(sort_nums)):
if i > node_index + 1 and sort_nums[i] == sort_nums[i-1]:
continue
temp_ans_list = ans_list + [sort_nums[i]]
bt(i, temp_ans_list)
for i in range(len(sort_nums)):
if i > 0 and sort_nums[i] == sort_nums[i-1]:
continue
bt(i, [sort_nums[i]])
return res
文章介绍了使用递归解决IP地址恢复和子集问题的Python代码。在复原IP地址问题中,通过两个for循环和剪枝优化进行处理;子集问题则包括无重复子集和有重复子集的生成,后者需避免重复结果。所有问题都采用类似的老套路——递归方法。

被折叠的 条评论
为什么被折叠?



