93.复原IP地址
1.题目
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
2.实现
思路是明了的,先弄清楚如何回溯,其次做题前需要划分好条件,在本题中成为IP地址需满足哪些条件呢?
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
res = []
n = len(s)
if n < 4 or n > 12:
return res
def findip(tmp, index):
if index == n:
if len(tmp) == 4:
res.append(".".join(tmp[:]))
return
for i in range(index, index + 3):
if i >= n or (4 - len(tmp)) * 3 < (n - i):
break
if i > index and s[index] == '0':
break
if int(s[index:i + 1]) > 255:
break
tmp.append(s[index:i + 1])
findip(tmp, i + 1)
tmp.pop()
findip([], 0)
return res
3.文章讲解
78.子集
1.题目
2.实现
如何回溯呢?——建议自己画树或者类比
目前接触到的节点处理是要么选择该位置的值,要么选择该位置及以前的值
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
res = []
n = len(nums)
def subset(tmp, index):
res.append(tmp[:]) # 此时树的每个节点都应加入到结果集中
if index == n: # 终止条件可以不加
return
for i in range(index, n):
tmp.append(nums[i])
subset(tmp, i + 1)
tmp.pop()
subset([], 0)
return res
3.文章讲解
注意:
如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!
拓展题目:90. 子集 II