算法刷题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); 这个就是把区间中的字符串获取出来。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot相关知识-图片描述(学习笔记)

学习java过程中的一些笔记&#xff0c;觉得比较重要就顺手记录下来了~ 目录 一、前后端请求1.前后端交互2.简单传参3.数组集合传参4.日期参数5.Json参数6.路径参数7.响应数据8.解析xml文件9.统一返回类10.三层架构11.分层解耦12.Bean的声明13.组件扫描14.自动注入 一、前后端请…

JVM—类加载子系统

JVM—类加载子系统 JVM的类加载是通过ClassLoader及其子类来完成的。 有哪些类加载器 类加载器如下&#xff1a; 启动类加载器&#xff08;BootStrap ClassLoader&#xff09;&#xff1a;负责加载JAVA_HOME\lib目录或通过-Xbootclasspath参数指定路径中的且被虚拟机认可&am…

YB4554是一款高性价比、完全集成的高输入电压单节锂离子电池充电器

概述&#xff1a; YB4554是一款高性价比、完全集成的高输 入电压单节锂离子电池充电器。充电器使用 锂离子电池所需的CC/CV充电配置文件。该 充电器接受高达24V的输入电压&#xff0c;但当输入 电压超过OVP阈值(通常为6.8V)时禁用&#xff0c; 以防止过度功耗。24V额定值消除了…

解锁金融数据中心场景,实现国产化AD替代,宁盾身份域管为信创电脑、应用提供统一管理

随着信创国产化改造持续推进&#xff0c;越来越多的金融机构不断采购信创服务器、PC、办公软件等&#xff0c;其 IT 基础设施逐渐迁移至国产化 IT 架构下。为支撑国产化 IT 基础设施的正常使用和集中管理运维&#xff0c;某金融机构数据中心的微软Active Directory&#xff08;…

DFS-0与异或问题,有奖问答,飞机降落

代码和解析 #include<bits/stdc.h> using namespace std; int a[5][5]{{1,0,1,0,1}}; //记录图中圆圈内的值&#xff0c;并初始化第1行 int gate[11]; //记录10个逻辑门的一种排列 int ans; //答案 int logic(int x, int y, int op){…

辽宁梵宁教育课程精选:打造设计技能,提升职场竞争力

在当今快速发展的社会中&#xff0c;职场竞争日益激烈&#xff0c;拥有一门出色的技能成为了提升自身竞争力的关键。辽宁梵宁教育课程精选致力于为广大学习者提供高品质的教育资源&#xff0c;帮助学员打造设计技能&#xff0c;从而在激烈的职场竞争中脱颖而出。 设计技能在职…

如何使用PL/SQL Developer工具导出clob字段的表?

1 准备测试数据 导出测试对象&#xff1a;表test_0102&#xff0c;others字段为clob类型 --创建中间表test_0101 create table test_0101( id number, name varchar2(20), others clob);--插入100条测试数据 beginfor i in 1..100 loopinsert into test_0101 values(i,i||_a,l…

Windows11安装MySql-8.0.36安装详细教程(保姆级教程)

之前一直用的mysql5.7&#xff0c;最近导入一个项目一直报错&#xff0c;经查阅发现数据库mysql版本太老&#xff0c;今天特地重头下载安装配置一下&#xff0c;做个记录供大家参考。 下载安装包&#xff1a; 下载地址&#xff1a;https://dev.mysql.com/downloads/ 进入后选…

蓝桥杯练习笔记(十七)

蓝桥杯练习笔记&#xff08;十七&#xff09; 一、 输入样例 7 7 1000001 0100010 0010100 0001AAA 00010A0 00010A0 00010A0蓝桥官网题解&#xff1a; 该题解是用了三个循环分别对三个方向的相同字符的长度进行统计&#xff0c;找出最大长度&#xff0c;最后对找出的最长Y进…

【第十一届大唐杯全国大学生新一代信息通信技术大赛】赛题分析

赛道一 一等奖 7% 二等奖 15% 三等奖 25% 赛道二 参考文档&#xff1a; 《第十一届大唐杯全国大学生新一代信息通信技术大赛&#xff08;产教融合5G创新应用设计&#xff09;专项赛说明.pdf》 一等奖&#xff1a;7% 二等奖&#xff1a;10% 三等奖&#xff1a;20% 赛项一&am…

调用飞书获取用户Id接口成功,但是没有返回相应数据

原因&#xff1a; 该自建应用没有开放相应的数据权限。 解决办法&#xff1a; 在此处配置即可。

java实现运行脚本文件

在最近的项目中&#xff0c;有一个需求是前端传给我一个脚本文件&#xff0c;然后我需要运行脚本文件后将结果进行返回&#xff0c;那接下来就让我们看看是怎么做的吧&#xff01; public R runScripts(Integer id) {ScriptsInfo scriptsInfo this.baseMapper.selectById(id);…

QA测试开发工程师面试题满分问答5: 内存溢出和内存泄漏问题

概念阐述 内存溢出&#xff08;Memory Overflow&#xff09;和内存泄漏&#xff08;Memory Leak&#xff09;是与计算机程序中的内存管理相关的问题&#xff0c;它们描述了不同的情况。 内存溢出是指程序在申请内存时&#xff0c;要求的内存超出了系统所能提供的可用内存资源…

使用Flutter创建带有图标提示的TextField

在移动应用开发中&#xff0c;TextField是一种常用的用户输入小部件。然而&#xff0c;有时向用户提供有关他们应该输入什么的提示或说明是很有帮助的。在本教程中&#xff0c;我们将创建一个Flutter应用程序&#xff0c;演示如何在TextField旁边包含一个图标提示。 编写代码 …

1、认识MySQL存储引擎吗?

目录 1、MySQL存储引擎有哪些&#xff1f; 2、默认的存储引擎是哪个&#xff1f; 3、InnoDB和MyISAM有什么区别吗&#xff1f; 3.1、关于事务 3.2、关于行级锁 3.3、关于外键支持 3.4、关于是否支持MVCC 3.5、关于数据安全恢复 3.6、关于索引 3.7、关于性能 4、如何…

Docker容器与虚拟化技术:OpenEuler 部署 ES 与 Kibana

目录 一、实验 1.环境 2.OpenEuler 部署 ES (EalasticSearch) 3.OpenEuler 部署 Kibana 4.部署 Elasticvue插件 5.使用cpolar内网穿透 6.使用Elasticvue 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 1…

Linux 著名的sudo、su是什么?怎么用?

一、su 什么是su&#xff1f; su命令&#xff08;简称是&#xff1a;substitute 或者 switch user &#xff09;用于切换到另一个用户&#xff0c;没有指定用户名&#xff0c;则默认情况下将以root用户登录。 为了向后兼容&#xff0c;su默认不改变当前目录&#xff0c;只设…

4.6(信息差)

&#x1f30d; 山西500千伏及以上输电线路工程首次采用无人机AI自主验收 &#x1f30b; 中国与泰国将开展国际月球科研站等航天合作 ✨ 网页版微软 PowerPoint 新特性&#xff1a;可直接修剪视频 &#x1f34e; 特斯拉开始在德国超级工厂生产出口到印度的右舵车 1.马斯克&…

计数排序解读

当我们提及排序算法时&#xff0c;通常会想到冒泡排序、选择排序、插入排序、归并排序和快速排序等经典算法。然而&#xff0c;今天我们要探讨的是一种非比较型整数排序算法——计数排序。计数排序在某些特定场景下表现出色&#xff0c;具有线性的时间复杂度。下面我们将深度剖…

Android 11 上的文件读写无权限问题

Android 6以上需要动态申请读写权限&#xff0c;但是11以上动态申请了读写权限也是无效。并且手动给予权限没有该按钮。 如上图华为钱包有个所有文件权限、但是百度地图只有仅媒体权限&#xff0c;仅媒体权限&#xff08;动态申请读写权限&#xff09;给予后软件还是没法访问文…