39. 组合总和
题目链接:LeetCode - The World's Leading Online Programming Learning Platform
题目链接/文章讲解:代码随想录
视频讲解:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)| 回溯法精讲!_哔哩哔哩_bilibili
解题思路:
设置一个stack path 一个结果res和一个当前和
定义回溯(candidates,target,start_index 传入start_index的原因是在回溯时我们需要知道他应该从哪一个起始值进行递归),首先设置basic condition 如果sum=target的话,将当前path存入res再返回,如果当前sum>target 直接返回。 不合符条件的话 就进入回溯中的for loop,从start_index到 len(candidates) 循环,将当前i append进path 并加上sum 做回溯递归,注意此时start_index是i,因为我们可以重复使用i。当递归到底返回后 要注意回溯 也就是pop我们的path并减去当前值。
最后执行我们的function并return我们res
class Solution(object):
def __init__(self):
self.path=[]
self.res=[]
self.sum=0
def combinationSum(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
if not candidates:
return
def backtracking(candidates, target, start_index):
if self.sum == target:
self.res.append(self.path[:])
return
if self.sum > target:
return
for i in range(start_index,len(candidates)):
self.sum += candidates[i]
self.path.append(candidates[i])
backtracking(candidates, target, i)
self.sum -= candidates[i]
self.path.pop()
backtracking(candidates, target, 0)
return self.res
40.组合总和II
题目链接:LeetCode - The World's Leading Online Programming Learning Platform
题目链接/文章讲解:代码随想录
视频讲解:回溯算法中的去重,树层去重树枝去重,你弄清楚了没?| LeetCode:40.组合总和II_哔哩哔哩_bilibili
解题思路:
设置一个stack path 一个结果res和一个当前和
提前为查重做准备工作 给candidates 进行排序
定义回溯(candidates,target,start_index 传入start_index的原因是在回溯时我们需要知道他应该从哪一个起始值进行递归),首先设置basic condition 如果sum=target的话,将当前path存入res再返回,如果当前sum>target 直接返回。 不合符条件的话 就进入回溯中的for loop,从start_index到 len(candidates) 循环,首先进行查重操作(如果当前的i不是start_index 判断现在的值是否等于前一个index的值 如果是的话 说明我们已经已这个数做过回溯了 我们就跳过这个i )然后将当前i append进path 并加上sum 做回溯递归,注意此时start_index是i+1,因为我们不可以重复使用i。当递归到底返回后 要注意回溯 也就是pop我们的path并减去当前值。
最后执行我们的function并return我们res
class Solution(object):
def __init__(self):
self.path=[]
self.res=[]
self.sum_=0
def combinationSum2(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
candidates.sort()
def backtracking(candidates,target,start_index):
if self.sum_ == target:
self.res.append(self.path[:])
return
if self.sum_ > target:
return
for i in range(start_index, len(candidates)):
if i > start_index and candidates[i] == candidates[i-1]:
continue
self.path.append(candidates[i])
self.sum_+=candidates[i]
backtracking(candidates,target,i+1)
self.sum_-=candidates[i]
self.path.pop()
backtracking(candidates,target,0)
return self.res
131.分割回文串
题目链接:LeetCode - The World's Leading Online Programming Learning Platform
视频讲解:带你学透回溯算法-分割回文串(对应力扣题目:131.分割回文串)| 回溯法精讲!_哔哩哔哩_bilibili
解题思路:
首先创建一个stack path和一个结果res
然后简历回溯方程(s,start_index这里作为划分线),如果当前的的分割线到了最后那就是=s的长度时 说明当前是一个可以行得通的结果 放入res 并返回。然后写for loop 从start_index到 len(candidates) 的循环 设置一个temp是从start_index到当前i(因为str切片我们需要+1)的字符,如果当前字符是回文 则可以将它放进path 并递归为后面的方程进行分割,递归完成后要将前面的temp删除掉。 如果不是回文 那我们这一次的切割点就要往后挪一个。 最后要返回self.res
class Solution(object):
def __init__(self):
self.path=[]
self.res=[]
def partition(self, s):
"""
:type s: str
:rtype: List[List[str]]
"""
if not s:
return
def backtacking(s,start_index):
if start_index==len(s):
self.res.append(self.path[:])
return
for i in range(start_index,len(s)):
temp=s[start_index:i+1]
if temp == temp[::-1]:
self.path.append(temp)
backtacking(s,i+1)
self.path.pop()
else:
continue
backtacking(s,0)
return self.res