93.复原IP地址
回溯函数有四个参数,第一个是字符串,第二个是目前在字符串中的索引开头位置,第三个是目前的ip位置,第四个是已经放入ip的字符串。
回溯的条件是ip位置大于3,或者索引大于等于字符串的长度,在索引等于字符串长度并且ip位置刚好为3的时候把这个ip添加到输出结果中。
主体部分是做一个循环,因为ip每一位最多三个数字,所以可以取1~3个字符出来,取出来之后做判断这个数是否符合要求,如果是0则直接跳过取别的数目的字符,直接进入下一步的递归,索引+1,ip位置也加一,如果数字大于255则跳过这个可能。数字符合要求的话则进入下一步的递归,索引按照取的字符个数增加,ip位置+1。
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
self.ans = []
self.backward(s, 0, -1, [])
return self.ans
def backward(self, string, index, position, pre):
if position > 3:
return
if index >= len(string):
if position == 3 and index == len(string):
self.ans.append('.'.join(pre[:]))
return
for i in range(3):
if i == 0 and string[index] == '0':
pre.append(string[index])
self.backward(string, index+1, position+1, pre)
pre.pop()
break
else:
num = string[index:index+i+1]
if int(num) > 255:
break
pre.append(num)
self.backward(string, index+i+1, position+1, pre)
pre.pop()
78.子集
先把现在的添加到答案中再进行下一步迭代,因为是组合所以使用过的数字不会再使用,索引+1。
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
self.ans = []
self.backward(nums, [])
return self.ans
def backward(self, nums, pre):
self.ans.append(pre[:])
for i in range(len(nums)):
pre.append(nums[i])
self.backward(nums[i+1:], pre)
pre.pop()
90.子集II
在上一题的基础上多一个和前一个元素不相同再进入下一步的判断就行了
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
nums.sort()
self.ans = []
self.backward(nums, [])
return self.ans
def backward(self, nums, pre):
self.ans.append(pre[:])
for i in range(len(nums)):
if i==0 or i>0 and nums[i] != nums[i-1]:
pre.append(nums[i])
self.backward(nums[i+1:], pre)
pre.pop()