代码随想录27期|Python|Day27|回溯算法|39.组合总和|40.组合总和II|131.分割回文串

39. 组合总和

在Day24组合问题的模版上加上了一个“可以重复选用当前值”的选项,递归中调用backtracking的idx由i + 1改为i:

self.backtracking(i, path, res, candidates, target)  # 起始位置变成i,可以重复使用当前的值
class Solution(object):
    def combinationSum(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        res = []
        self.backtracking(0, [], res, candidates, target)
        return res

    def backtracking(self, idx, path, res, candidates, target):
        # 终止条件
        if target < 0:
            return
        if target == 0:
            res.append(path[:])  # 加入res
            return  # 回溯
            
        for i in range(idx, len(candidates)):
            path.append(candidates[i])
            target -= candidates[i]
            self.backtracking(i, path, res, candidates, target)  # 起始位置变成i,可以重复使用当前的值
            target += candidates[i]
            path.pop()  # 回溯

 40. 组合总和 II

本题需要注意去重:首先对于树进行排序。其次需要明确的是,在一个树枝上是不需要去重的,但是对于同一层,是需要去重的。也就是一个组合内,可以出现重复数字,但是不能两个组合相同。

所以需要在i遍历的时候先判读是不是重复的,然后再递归。也就是平行移动的时候需要考虑,但是在纵向移动的时候不用。

class Solution(object):
    def combinationSum2(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        res = []
        candidates = sorted(candidates)
        used = [] * len(candidates)
        self.backtracking(0, [], res, candidates, target)
        return res

    def backtracking(self, idx, path, res, candidates, target):
        # 终止条件
        if target < 0:
            return
        if target == 0:
            res.append(path[:])  # 加入res
            return  # 回溯
            
        for i in range(idx, len(candidates)):
            # 如果后面一个和前面一个是相等的,那么他们所组成的组合一定有相同的
            if i > idx and candidates[i] == candidates[i-1]:
                continue
            path.append(candidates[i])
            target -= candidates[i]
            self.backtracking(i + 1, path, res, candidates, target)  # 起始位置变成i,可以重复使用当前的值
            target += candidates[i]
            path.pop()  # 回溯

 131. 分割回文串

本题的特殊点在于对于数字的分割,需要传入下一层级的其实是分割之后的子序列,其次还有对于回文字判断,相当于在回溯前加了一个if条件。

class Solution(object):
    def partition(self, s):
        """
        :type s: str
        :rtype: List[List[str]]
        """
        res = []
        self.backtracking([], 0, s, res)
        return res
    
    def backtracking(self, path, start_idx, s, res):
        if start_idx == len(s):
            res.append(path[:])
            return

        for i in range(start_idx, len(s)):
            # 多了一步:判断是否是回文数
            if self.ispalindrome(start_idx, i, s):
                path.append(s[start_idx:i+1])  # 在i处切段
                self.backtracking(path, i + 1, s, res)  # 传入断点索引作为新的start_idx
                path.pop()
    
    def ispalindrome(self, start_idx, cur, string):
        i = start_idx
        j = cur
        while i <= j:
            if string[i] != string[j]:
                return False
            i += 1
            j -= 1
        return True

判断回文字也不需要使用函数,可以使用[::-1]来判断两个序列是否相等:

if s[start_index: i + 1] == s[start_index: i + 1][::-1]:

也可以使用all来简洁书写:

    def isPalindrome(self, s):
        return all(s[i] == s[len(s) - 1 - i] for i in range(len(s) // 2))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/274008.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最新国内使用GPT4教程,GPT语音对话使用,Midjourney绘画,ChatFile文档对话总结+DALL-E3文生图

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;文档对话总结DALL-E3文生图&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和…

ESP8266 ESP-01/01s 工作模式与固件下载烧录接线

注意点&#xff1a; ESP8266 ESP-01与 ESP8266 ESP-01s接线类似 。本文使用的是ESP8266 ESP-01 WIFI模块&#xff0c;详细信息见如下图片。本文固件下载的是ESP8266 的MQTT固件&#xff0c;下载其它固件流程一致。本文使用的是杜邦线连接面包板来进行使用&#xff0c;与使用开发…

Bert模型from_pretrained报网络错误解决办法

问题描述&#xff1a; 服务器或者本地运行以下代码时报网络连接错误&#xff1a; from transformers import AutoTokenizermodel_checkpoint "distilbert-base-uncased" tokenizer AutoTokenizer.from_pretrained(model_checkpoint, use_fastTrue, cache_dir./cac…

【大数据HA】HAProxy实现thrift协议HMS服务的高可用-附Chatgpt协助截图

背景 之前安装了HMS(Hive metastore service)&#xff0c;独立于hive运行&#xff0c;安装部署过程见我下面列出的另一篇文章&#xff0c;需要为它建立HA高可用功能。防止在访问时出现单点故障问题。 【大数据】Docker部署HMS(Hive Metastore Service)并使用Trino访问Minio-C…

fragstats:景观指数趋势分析

作者&#xff1a;CSDN _养乐多_ 本文将介绍景观指数时间序列的趋势分析&#xff0c;包括趋势类型、斜率、截距等。以及景观指数突变分析所用的软件和 python 代码。 结果如下图所示&#xff0c; 图1 趋势分类图 图2 MK趋势分析 文章目录 一、景观指数计算二、景观指数时间序…

网络技术基础与计算思维实验教程_4.4_RIPv2配置实验

构建 放置三个型号为2811的路由器 给router0安装两个快速以太网接口 &#xff02; 同样的方法给router2安装 为1安装有一个以太网接口的模块 这样router1就有三个快速以太网接口和两个无线路由器接口了 构建两个和router0相连的以太网 构建和router2相连的以太网 构建和r…

【JavaScript】闭包机制

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

C#高级 01.Net多线程

一.基本概念 1.什么是线程&#xff1f; 线程是操作系统中能独立运行的最小单位&#xff0c;也是程序中能并发执行的一段指令序列线程是进程的一部分&#xff0c;一个进程可以包含多个线程&#xff0c;这些线程共享进程资源进程有线程入口&#xff0c;也可以创建更多的线程 2.…

不浪费时间,昂首资本1分钟如何快速学习MT4价差

不要浪费时间在手工计算上&#xff0c;昂首资本解释一下如何快速学习MT4价差&#xff0c;。 想要在MT4中输入交易时&#xff0c;需要在交易窗口中设置未来交易的参数。在同一个窗口中&#xff0c;可以看到卖价和买价。如果在上面的例子中比较这两个价格&#xff0c;就会发现两…

个人网站的搭建部署及自定义域名

个人网站的搭建部署及自定义域名 写在前面个人网站的搭建个人网站的部署自定义域名更多模板 写在前面 个人网站模板获取方式&#xff1a;个人网站模板视频教程&#xff1a;视频教程 个人网站的搭建 使用PyCharm打开提前准备好的个人网站模板&#xff1a; 双击打开index.htm…

FontsTest.java

package fonts;import java.awt.Font; import java.awt.GraphicsEnvironment;/*** Font测试* * 不同字体在不同操作系统是不一样的&#xff0c;更新* * linux&#xff1a; https://blog.csdn.net/spencer_tseng/article/details/135232675windows&#xff1a; https://blog.cs…

【2】Docker Compose编排

Docker Compose 使用 Docker 帮助我们解决服务的打包安装的问题&#xff0c;随着而来的问题就是服务过多的带来如下问题&#xff1a; 多次使用 Dockerfile、Build、Image 命令或者 DockerHub 拉取 Image&#xff1b;需要创建多个 Container&#xff0c;多次编写启动命令&…

探究Android DreamService的梦幻世界

探究Android DreamService的梦幻世界 引言 DreamService的概述 在Android开发中&#xff0c;DreamService是一种特殊类型的服务&#xff0c;它可以用于创建梦幻世界的屏保应用。梦幻世界是一种用户界面显示模式&#xff0c;当设备进入空闲状态时&#xff0c;系统会自动启动D…

qt项目-《图像标注软件》源码阅读笔记-类图

1. 开源项目链接 GitHub - jameslahm/labelme: A image annotation software for 2D or 3D images 2. 项目界面 3. 项目类图 全部类图&#xff1a; 3.1 Shape 形状的绘制及形状的存储 qt项目-《图像标注软件》源码阅读笔记-Shape类绘图及其子类-CSDN博客 负责形状的绘制及…

unknown variable ‘authentication_policy=mysql_native_password‘

unknown variable authentication_policymysql_native_password 背景解决尝试一尝试二(解决) 总结 背景 mac上安装多个版本数据库。我是通过dma安装的&#xff0c;先装的5.7&#xff0c;再装的5.8&#xff0c;然后5.8的能正常用&#xff0c;5.7的启动不起来。报错信息为如下 …

C++ Qt开发:QItemDelegate自定义代理组件

老规矩&#xff0c;首先推荐好书&#xff1a; Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍…

程序员如何高效学习技术?

我们相信努力学习一定会有收获&#xff0c;但是方法不当&#xff0c;既让人身心疲惫&#xff0c;也没有切实的回报。 不少朋友每天都阅读技术文章&#xff0c;但是第二天就忘干净了。工作中领导和同事都认可你的沟通和技术能力&#xff0c;但是跳槽面试却屡屡碰壁。面试官问技术…

龙芯loongarch64服务器编译安装scikit-learn

前言 根据我之前的文章介绍&#xff0c;龙芯loongarch64服务器中的很多python依赖包安装有问题&#xff0c;发现其中安装的"scikit-learn"就无法正常使用&#xff0c;会报如下错误No module named sklearn.__check_build._check_build&#xff1a; 解决办法 从第三方…

java keytool.exe ssl

JDK如果没有先安装 JDK8 install_jdk aleady install-CSDN博客 java keytool.exe ssl keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore D:\server.keystore -validity 3650 server.ssl.key-storeD:\server.keystore server.ssl.key-…