代码随想录|Day27|回溯03|39.组合总和、40.组合总和II、131.分割回文串

2024-03-22 20:28

本文主要是介绍代码随想录|Day27|回溯03|39.组合总和、40.组合总和II、131.分割回文串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 39. 组合总和

class Solution:

    def combinationSum(self, candidates, target):

        result = []

        candidates.sort()  # 需要排序

        self.backtracking(candidates, target, 0, 0, [], result)

        return result

    def backtracking(self, candidates, target, total, startIndex, path, result):

        if total == target:

            result.append(path[:])

            return

        for i in range(startIndex, len(candidates)):

            if total + candidates[i] > target:   #这一步剪枝很重要

                continue

            total += candidates[i]

            path.append(candidates[i])

            self.backtracking(candidates, target, total, i, path, result)

            total -= candidates[i]

            path.pop()

【思考】如candidates= [2,3,6,7]   target = 7。 

if total + candidates[i] > target:   #这一步剪枝很重要

                continue

这条剪枝使得当比如出现2+2+2+2》7时,不必再往下走到total——  path.pop()这些步骤,而是到continue,再走2+2+2+3,2+2+2+6.。。节省开销

40. 组合总和ii (后补)

class Solution:

    def combinationSum2(self, candidates, target):

        result = []

        used = [False] * len(candidates)

        candidates.sort()

        self.backtracking(candidates, target, 0, 0, [], result, used)

        return result

    def backtracking(self, candidates, target, total, start_index, path, result, used):

        if total == target:

            result.append(path[:])

        for i in range(start_index, len(candidates)):

            if total + candidates[i] > target:

                break    #剪枝,当和大于target时,直接进入下一个def

            if i>start_index and candidates[i] == candidates[i-1] and not used[i-1]:

                continue   #去重

            path.append(candidates[i])

            total += candidates[i]

            used[i] = True

            self.backtracking(candidates, target, total, i+1, path, result, used)

            path.pop()

            total -= candidates[i]

            used[i] = False

【思考】用used来去重,当used [ i-1] = 0即False 时,在同一层上重复,需要去重;当 used [ i-1] = 1即True时,在同一枝上重复,不需要去重。

131. 分割回文串

class Solution:

    def partition(self, s: str) -> List[List[str]]:

        result = []

        self.backtracking(s, 0, [], result)

        return result

   

    def backtracking(self, s, start_index, path, result ):

        if start_index == len(s):

            result.append(path[:])

            return

        for i in range(start_index, len(s)):

            if s[start_index : i+1] == s[start_index : i+1][::-1]:  #判断是否为回文字符串优化写法

                path.append(s[start_index : i+1])

                self.backtracking(s, i+1, path, result)

                path.pop()

【思考】分割问题,重点在于start_index 和 i 相当于两个指针。重点理解: 当start_index = 0, i取到1时,就可以取得s[0:2]这个字符串。

这篇关于代码随想录|Day27|回溯03|39.组合总和、40.组合总和II、131.分割回文串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/836132

相关文章

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

csu1328(近似回文串)

题意:求近似回文串的最大长度,串长度为1000。 解题思路:以某点为中心,向左右两边扩展,注意奇偶分开讨论,暴力解即可。时间复杂度O(n^2); 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>#include<string>#inclu

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip