代码随想录算法训练营第27天|● 39. 组合总和● 40.组合总和II● 131.分割回文串

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
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值