算法刷题Day27 | 39. 组合总和、40.组合总和II、131.分割回文串

目录

  • 0 引言
  • 1 组合总和
    • 1.1 我的解题
  • 2 组合总和II
    • 2.1 解题
  • 3 分割回文串
    • 3.1 切割
    • 3.2 总结:分割和组合的区别

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:算法专栏
  • 💥 标题:算法刷题Day27 | 39. 组合总和、40.组合总和II、131.分割回文串
  • ❣️ 寄语:书到用时方恨少,事非经过不知难!

0 引言

趁着周末赶紧追

1 组合总和

  • 🎈 文档讲解
  • 🎈 视频讲解
  • 🎈 做题状态:

1.1 我的解题

这道题其实就是可以把已经遍历的元素再遍历一次,就是改变了 firstIndex 的位置而已。逻辑和之前的题目类似。还有终止条件不太一样就是。

class Solution
{
public:
    // 1. 回溯函数参数和返回值
    void backTracing(vector<int>& candidates, int target, int firstIndex, vector<int>& path, vector<vector<int>>& paths)
    {
        // 2. 终止条件
        int sum = 0;
        for (auto data : path)
        {
            sum += data;
        }
        if (sum > target)
        {
            return;
        }
        if (sum == target)
        {
            paths.emplace_back(path);
            return;
        }

        // 3. 单层回溯逻辑
        for (int i = firstIndex; i < candidates.size(); i++)
        {
            path.emplace_back(candidates[i]);
            backTracing(candidates, target, i, path, paths);
            path.pop_back();
        }
    }

    vector<vector<int>> combinationSum(vector<int>& candidates, int target) 
    {
        vector<vector<int>> paths;
        vector<int> path;
        backTracing(candidates, target, 0, path, paths);
        return paths;
    }

};

2 组合总和II

  • 🎈 文档讲解
  • 🎈 视频讲解
  • 🎈 做题状态:

2.1 解题

这道题注意了,集合中不能有重复的。上一道题简单的改变 firstIndex 就可以避免重复的组合是因为,给出的集合中本身不含有重复的数字。但是这道题中是包含重复数字的。

这道题比较难,理解关键点在于 去重:树层去重、树枝去重。

那么如何判断当前是同一层还是树枝呢?使用一个额外的 used 数组来标识。

详细的解释参考文档。

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int>& candidates, int target, int sum, int startIndex, vector<bool>& used) {
        if (sum == target) {
            result.push_back(path);
            return;
        }
        for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) {
            // used[i - 1] == true,说明同一树枝candidates[i - 1]使用过
            // used[i - 1] == false,说明同一树层candidates[i - 1]使用过
            // 要对同一树层使用过的元素进行跳过
            if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) {
                continue;
            }
            sum += candidates[i];
            path.push_back(candidates[i]);
            used[i] = true;
            backtracking(candidates, target, sum, i + 1, used); // 和39.组合总和的区别1,这里是i+1,每个数字在每个组合中只能使用一次
            used[i] = false;
            sum -= candidates[i];
            path.pop_back();
        }
    }

public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        vector<bool> used(candidates.size(), false);
        path.clear();
        result.clear();
        // 首先把给candidates排序,让其相同的元素都挨在一起。
        sort(candidates.begin(), candidates.end());
        backtracking(candidates, target, 0, 0, used);
        return result;
    }
};


3 分割回文串

  • 🎈 文档讲解
  • 🎈 视频讲解
  • 🎈 做题状态:

3.1 切割

使用回溯进行切割是如何进行的呢? 如何切割是回溯的一种经典题目了。

犀利糊涂写出来了,有一个疑惑的地方,在判断当前子串不是回文串时,为什么是进入下一个循环而不是跳出所有循环。

因为同一个循环内是同一层,加入当前层的前面有一个节点不满足,直接break的话,后面满足的节点也会被去除。所以应该使用continue。continue是跳过当前的节点,也就是说以这个节点为根的所有结果肯定都是不满足的。

class Solution {
public:
    // 判断是否是回文串
    bool isPalindrome(string s)
    {
        for (int i = 0; i < s.size()/2; i++)
        {
            if (s[i] != s[s.size() - 1 - i])
            {
                return false;
            }
        }
        return true;
    }

    // 回溯 (startIndex从0开始)
    void backTracing(string& s, int startIndex, vector<string>& path, vector<vector<string>>& paths)
    {
        // 终止条件
        if (startIndex == s.size())
        {
            paths.emplace_back(path);
            return;
        }

        // 单层回溯逻辑
        for (int i = startIndex; i < s.size(); i++)
        {
            string tmp = s.substr(startIndex, i - startIndex + 1);
            if (isPalindrome(tmp))
            {
                path.emplace_back(tmp);
                backTracing(s, i + 1, path, paths);
                path.pop_back();
            }
            else
            {
                continue;	// 注意是continue ,而不是break
            }
        }
    }

    vector<vector<string>> partition(string s) 
    {
        vector<string> path;
        vector<vector<string>> paths;
        backTracing(s, 0, path, paths);
        return paths;
    }
};

3.2 总结:分割和组合的区别

分割和组合的区别:组合是每次选取一个元素出来然后加入到path数组中。而分割就是取一个区间的元素出来,然后加入到path数组中;

那么分割区间的数据如何获取呢?根据当期遍历的 i 和 startIndex 就可以进行确定。
string tmp = s.substr(startIndex, i - startIndex + 1); 这个就是把区间中的字符串获取出来。

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

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

相关文章

OpenHarmony实战开发-多设备自适应能力

介绍 本示例是《一次开发&#xff0c;多端部署》的配套示例代码&#xff0c;展示了页面开发的一多能力&#xff0c;包括自适应布局、响应式布局、典型布局场景以及资源文件使用。 说明&#xff1a; 自适应布局能力仅可以保证在外部容器大小在一定范围内变化时&#xff0c;容…

考研数学|张宇《1000题》做不下来,怎么办?

张宇的1000题对于初学者 来说确实有一些难度&#xff0c;我的建议是刷完知能行之后再做1000题。 首先&#xff0c;让我们来看看传统习题册存在的一些问题。虽然传统习题册通常会覆盖考试的各个知识点和题型&#xff0c;但其中一些问题在于它们可能过于注重题目的数量&#xff…

性能分析-nginx

tomcat 像kyj项目请求直接对接 tomcat&#xff0c;tomcat的连接池就会直接影响“并发用户数” 如果这种情况下做性能测试的时候&#xff0c;并发用户数不能满足要求&#xff0c;可以适当加大线程池的配置。 如&#xff1a;项目性能测试发现项目所在机器&#xff0c;资源利用率…

产品推荐 | 瑞苏盈科基于立体帧捕捉和视频处理应用的火星Mars EB1开发板

01 产品概述 火星Mars EB1底板是为火星Mars系列FPGA和SoC核心板设计的通用底板&#xff0c;非常适用于立体帧捕捉和视频处理应用&#xff0c;可以为构建基于FPGA的定制化硬件系统提供一个良好的基础和开端。 02 核心亮点 ■ 与所有火星Mars系列FPGA和SoC核心板兼容 ■ 适用…

Stable Diffusion文生图技术详解:从零基础到掌握CLIP模型、Unet训练和采样器迭代

文章目录 概要Stable Diffusion 底层结构与原理文本编码器&#xff08;Text Encoder&#xff09;图片生成器&#xff08;Image Generator&#xff09; 那扩散过程发生了什么&#xff1f;stable diffusion 总体架构主要模块分析Unet 网络采样器迭代CLIP 模型 小结 概要 Stable …

windows一键休眠,一键唤醒

1.使windows睡眠不可用&#xff0c;cmd以管理员身份运行&#xff1a; powercfg.exe /hibernate off 2.桌面创建快捷键 Rundll32.exe Powrprof.dll,SetSuspendState Sleep

王权与自由国际服测试资格申请 王权与自由steam国际服预约教程

《王权与自由》是一款由《剑灵》开发商NCsoft公开的旗下大型多人MMORPG新作游戏作品。攻城战&#xff0c;这是游戏中的一个重要玩法&#xff0c;主要分为攻城方和防守方。攻城方需要占领外城的遗址&#xff0c;并利用高轮&#xff08;包括碎石机、跳跃者和战斗航母&#xff09;…

蓝桥杯第六届c++大学B组详解

前言&#xff1a; 看了很多博客以及视频讲解&#xff0c;感觉都不是很清楚&#xff0c;比较模棱两可&#xff0c;所以干脆自己一边想&#xff0c;一边写博客&#xff0c;也可帮助到其他人&#xff0c;都是根据自己的逻辑来尽量清楚简单的讲清楚题目&#xff0c;喜欢的不要吝啬三…

【JVM】GC导致的性能问题排查与解决方案,日志、堆分析工具介绍

一、必要性 重要应用程序在使用过程中&#xff0c;忽然无法响应用户请求&#xff0c;排查发现网络联通无问题&#xff0c;gateway能够正常接收分发请求&#xff0c;应用进程正常&#xff0c;正常向注册中心发送请求&#xff0c;但是接收http请求全部返回报错。 添加gc后发现内…

前端秘法番外篇----学完Web API,前端才能算真正的入门

目录 一.引言 二.元素的获取和事件 1.获取元素 2.各种事件 2.1点击事件 2.2键盘事件 三.获取&修改操作 1.获取修改元素属性 2.修改表单属性 2.1暂停播放键的转换 2.2计数器的实现 2.3全选的实现 3.样式操作 3.1行内样式操作 3.2类名样式操作 四.节点 1.创…

​最新仿抖音短视频开源版+商城+短视频

​最新仿抖音短视频开源版商城短视频 最新仿抖音短视频开源版商城短视频&#xff0c;完成度已经可以达到官方App的80%了 基于Vue、Vite 实现。使用了最新的 Vue 全家桶技术栈&#xff0c;接口数据通过 axios-mock-adapter模拟 源码截图&#xff1a; 免费下载地址&#xff…

visual studio 2017开发QT框架程序

1. 配置开发环境 首先创建项目 进入到项目后&#xff0c;右键点击项目点击属性&#xff0c;配置如下&#xff1a;

✌2024/4/4—力扣—盛最多水的容器

代码实现&#xff1a; 方法一&#xff1a;暴力解法——遍历左右边&#xff0c;找出所有面积&#xff0c;取最大值——超时 #define min(a, b) ((a) > (b) ? (b) : (a)) #define max(a, b) ((a) > (b) ? (a) : (b))int maxArea(int *height, int heightSize) {int ans …

CorelDRAW2024全网最详细独家讲解新版本新功能

各位粉丝大家好&#xff0c;为了让大家更深入的了解CorelDRAW2024新版的各项新功能&#xff0c;我们独家邀请到了Corel中国专家名师张苏老师&#xff0c;策划并录制30分钟全中文讲解栏目&#xff01;干货满满&#xff0c;全程演示&#xff0c;一览CorelDRAW2024新版的各项新功能…

基于RTThread的学习(三):正点原子潘多拉 QSPI 通信 W25Q128 实验

1、基于芯片创建工程 2、QSPI配置 2.1、RTThing_setting 设置组件 2.2、配置board.h 文件 2.3、cubemx生成QSPI的硬件初始化代码&#xff1b;HAL_QSPI_MapInit; 这里注意&#xff1a;你所买的开发板对应的qspi 连接的是否是cubemx 上边显示的&#xff0c;如果不是你需要将引脚…

1.8.3 卷积神经网络近年来在结构设计上的主要发展和变迁——GoogleNet/inception-v1

1.8.3 卷积神经网络近年来在结构设计上的主要发展和变迁——GoogleNet/ inception-v1 前情回顾&#xff1a; 1.8.1 卷积神经网络近年来在结构设计上的主要发展和变迁——AlexNet 1.8.2 卷积神经网络近年来在结构设计上的主要发展和变迁——VGGNet GoogleNet问题 在VGGNet简单堆…

windows server 2019-搭建文件共享服务器

一、共享服务器概述 通过网络提供文件共享服务、提供文件下载和上传服务&#xff08;类似FTP服务器&#xff09; 文件共享使用的是CIFS协议&#xff08;微软开发&#xff0c;微软全系服务器都自带此服务&#xff09; FTP服务器对外&#xff08;给客户&#xff09; 文件共享…

人力资源管理系统大揭秘!推荐企业选型攻略

在现代化企业管理中&#xff0c;人力资源管理系统的引入犹如为企业注入了智能血脉&#xff0c;极大地提升了人力资源管理的效率和质量。本文将聚焦以下几款人力资源管理系统&#xff1a;ZohoPeople、宏景云平台、红海云、SAP SuccessFactors、ADP Workforce Now&#xff0c;为您…

视频上传-实现断点续传

视频上传 单纯的视频上传好办 前端传一个大文件的流 后端按照 MultipartFile 接受 然后读数据。 但是问题是视频这种大文件 它一般不会短时间传完&#xff0c; 这中间如果 前端用户的网络不好断了 那么你这个大文件就要重新传 等于前面传的都白费了 所以大文件上传/下载都有…

python导入redis库错误的解决方法

python连接redis&#xff0c;很多推荐使用【redis】库&#xff0c; 但是我的IDE一直报错&#xff0c;我分别尝试python3.12和python3.8版本&#xff0c;都不行。错误如下图 解决办法就是 换个库。 换成【redis2】&#xff0c;之前写的代码配置啊什么的不需要改&#xff0c;很方…