93.复原IP地址
题目链接/文章讲解:代码随想录
视频讲解:回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili
首先设置path和结果列表
因为ip只能至多有12个数字,s大于12的话直接返回。 设置回溯方程(s和start_index,start_index为每次递归开始操作的index),如果当前path==4且start_index已经进行到最后s最后了 说明当前path是一个排列 ,放入res并返回。 如果path长度>4了 说明无需继续递归。然后设置for loop, 从start_index遍历到s,设置一个temp为start_index到i+1的s,如果当前这个temp满足条件=0或者在256和0之间且首字符不是0的话,叫他放进path里并递归,递归带入的参数是当前i的下一位 return回来时要注意回溯。
最后返回值
class Solution(object):
def __init__(self):
self.path= []
self.res = []
def restoreIpAddresses(self, s):
"""
:type s: str
:rtype: List[str]
"""
if len(s)>12:
return
def backtracking(s,start_index):
if len(self.path)==4 and start_index == len(s):
self.res.append(".".join(self.path))
return
if len(self.path) > 4:
return
for i in range(start_index,len(s)):
temp=s[start_index:i+1]
if (int(temp)<256 and int(temp)>0 and temp[0]!='0') or (temp=='0'):
self.path.append(temp)
backtracking(s, i+1)
self.path.pop()
backtracking(s, 0)
return self.res
78.子集
题目链接:LeetCode - The World's Leading Online Programming Learning Platform
题目链接/文章讲解:代码随想录
视频讲解:回溯算法解决子集问题,树上节点都是目标集和! | LeetCode:78.子集_哔哩哔哩_bilibili
解题思路:
先建立列表path 和res。
设置回溯方程,因为没有重复元素,所以可以直接将当前path复制进res。 设置base condition 如果start_index 等于nums的长度的话,说明已经到达最后一个字符,可以返回。 再写for loop,从start_index到字符最后的的循环,append当前nums[i]进path,然后递归,递归返回后则回溯。
返回res
class Solution(object):
def __init__(self):
self.path = []
self.res = []
def subsets(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
def backtracking(nums,start_index):
self.res.append(self.path[:])
if start_index == len(nums):
return
for i in range(start_index,len(nums)):
self.path.append(nums[i])
backtracking(nums,i+1)
self.path.pop()
backtracking(nums,0)
return self.res
90.子集II
题目链接/文章讲解:代码随想录
视频讲解:回溯算法解决子集问题,如何去重?| LeetCode:90.子集II_哔哩哔哩_bilibili
解题思路:
首先建立列表path 和res。
为查重提前做准备sort nums
设置回溯方程,因为没有重复元素,所以可以直接将当前path复制进res。 设置base condition 如果start_index 等于nums的长度的话,说明已经到达最后一个字符,可以返回。 再写for loop,从start_index到字符最后的的循环,进行查重,如果当前i>start_index且当前数字等于前一个数字的话 就可以跳过。 查重后可以append当前nums[i]进path,然后递归,递归返回后则回溯。
返回res
class Solution(object):
def __init__(self):
self.path=[]
self.res=[]
def subsetsWithDup(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
nums.sort()
def backtracking(nums, start_index):
self.res.append(self.path[:])
if start_index == len(nums):
return
for i in range(start_index,len(nums)):
if i > start_index and nums[i] == nums[i-1]:
continue
self.path.append(nums[i])
backtracking(nums,i+1)
self.path.pop()
backtracking(nums,0)
return self.res