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

文章提供了三个使用Python的回溯算法解决的编程问题:组合总和、组合总和II以及分割回文串。在组合总和问题中,算法寻找给定数组中所有可能的数的组合,使得它们的和为目标值;组合总和II则考虑了避免重复组合;分割回文串问题要求将字符串分割成多个回文子串。每个问题都通过递归函数和for循环实现,涉及到列表操作和字符串判断。

39. 组合总和:


代码思路

回溯的思想依然是for循环一边递归函数。

class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        res = []
        def bt(node_index, ans_lis, temp_sum):
            if temp_sum == target:
                res.append(ans_lis)
            for i in range(node_index, len(candidates)):
                if temp_sum > target:
                    break
                bt(i, ans_lis + [candidates[i]], temp_sum+candidates[i])
        for node_index in range(len(candidates)):
            bt(node_index, [candidates[node_index]], candidates[node_index])
        return res

40. 组合总和 II:


代码思路

这里主要是要考虑什么时候跳过重复答案。其余基本思路和上面一致。

class Solution:
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        sorted_list = sorted(candidates)
        res = []
        def bt(node_index, ans_list, temp_sum):
            if temp_sum == target:
                res.append(ans_list)
            for i in range(node_index+1, len(sorted_list)):
                if i > node_index+1 and sorted_list[i] == sorted_list[i-1]:
                    continue
                if temp_sum > target:
                    break
                bt(i, ans_list+[sorted_list[i]], temp_sum+sorted_list[i])
        for i in range(len(sorted_list)):
            if i > 0 and sorted_list[i] == sorted_list[i-1]:
                continue
            bt(i, [sorted_list[i]], sorted_list[i])
        return res

131. 分割回文串:


代码思路

思路其实就是先划第一刀,剩下的再慢慢划,深度就是划到列表所有字符凑起来等于原字符长度就停止。然后还要判断两个字符串是否是回文串,我用的是str = str[::-1]
这题比较烦的就是列表和字符串的转换,要细心一点。

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        str_list = list(s)
        
        res = []
        def bt(node_index, ans_lis):
            if len("".join(ans_lis)) == len(s):
                res.append(ans_lis)
                return  
            for i in range(node_index + 1, len(str_list)):
                if str_list[node_index + 1:i + 1] == str_list[node_index + 1:i + 1][::-1]:
                    bt(i, ans_lis + ["".join(str_list[node_index + 1:i + 1])])
                else:
                    continue

        for i in range(len(str_list)):
            if "".join(str_list[:i+1]) == "".join(str_list[:i+1])[::-1]:
                bt(i, ["".join(str_list[:i+1])])
        return res
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值