【代码随想录算法训练营】第27天 | 第七章 回溯(三)

主要内容

  1. 组合
  2. 组合排序去重
  3. 切割

题目

39. 组合总和

添加链接描述

思路分析

backtracking(candidates,target, i)
不用i+1了,表示可以重复读取当前的数

代码

class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        res = []
        path = []

        def backtracking(candidates,target, startindex):
            if sum(path) >= target:
                if sum(path) == target:
                    res.append(path[:])
                return

            for i in range(startindex, len(candidates)):
                path.append(candidates[i])
                backtracking(candidates,target, i)
                path.pop()

        backtracking(candidates,target, 0)
        return res    

40.组合总和II

添加链接描述

思路分析

排序,去重,要对同一树层使用过的元素进行跳过

代码

class Solution:
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        res = []
        path = []

        def backtracking(candidates, target, startindex):
            if sum(path) >= target:
                if sum(path) == target:
                    res.append(path[:])
                return

            for i in range(startindex, len(candidates)):
                # 去重
                if i > startindex and candidates[i] == candidates[i - 1]:
                    continue
                path.append(candidates[i])
                backtracking(candidates, target, i + 1)
                path.pop()
        # 排序
        backtracking(sorted(candidates), target, 0)
        return res

131.分割回文串

思路分析

难点在将分割转换为组合问题,startindex是切割线
在这里插入图片描述

代码

正反序判断

class Solution:
    def __init__(self):
        self.res = []
        self.path = []

    def partition(self, s: str) -> List[List[str]]:
        self.backtracking(s, 0)
        return self.res

    def backtracking(self, s: str, startindex: int):
        if startindex >= len(s):
            self.res.append(self.path[:])
            return

        for i in range(startindex, len(s)):
            temp = s[startindex:i+1]
            # 判断回文串
            if temp == temp[::-1]:
                self.path.append(temp)
                self.backtracking(s, i + 1)
                self.path.pop()
            else:
                continue

函数判断

class Solution:
    def __init__(self):
        self.res = []
        self.path = []

    def partition(self, s: str) -> List[List[str]]:
        self.backtracking(s, 0)
        return self.res

    def backtracking(self, s: str, startindex: int):
        if startindex >= len(s):
            self.res.append(self.path[:])
            return

        for i in range(startindex, len(s)):
            # 判断回文串
            if self.ispartition(s, startindex, i):
                self.path.append(s[startindex:i+1])
                self.backtracking(s, i + 1)
                self.path.pop()
            else:
                continue

    def ispartition(self, s, start, end):
        i, j = start, end
        while i < j:
            if s[i] != s[j]:
                return False
            i += 1
            j -= 1
        return True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值