代码随想录算法训练营Day27|回溯算法·组合总和、组合总和II、分割回文串

组合总和

class Solution{
private:vector<vector<int>>result;vector<int>path;void backtracking(vector<int>& candidates,int target,int sum,int startIndex){if(sum > target){return;}if(sum == target){result.push_back(path);return;}for(int i = startIndex; i < candidates.size(); i++){sum += candidates[i];path.push_back(candidates[i]);backtracking(candidates,target,sum,i);sum -= candidates[i];path.pop_back();}}public:vector<vector<int>>combinationSum(vector<int>&candidates, int target){result.clear();path.clear();backtracking(candidates,target,0,0);return result;}
};

剪枝(优化)

 先排序,才能剪枝,在for循环处剪枝

class Solution{
private:vector<vector<int>>result;vector<int>path;void backtracking(vector<int>& candidates, int target, int sum, int startIndex){if(sum == target){result.push_back(path);return;}for(int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++){sum += candidates[i];path.push_back(candidates[i]);backtracking(candidates,target,sum,i);sum -= candidates[i];path.pop_back();}}
public:vector<vector<int>>combinationSum(vector<int>&candidates,int target){result.clear();path.clear();sort(candidates.begin(),candidates.end());backtracking(candidates,target,0,0);return result;}
};

组合总和II

题目:给定数组candidates和一个目标数target,找出candidates中所有可以使数字和target的组合。candidates中的每个数字在每个组合中只能使用一次。 解集中不包含重复的组合。

思路:先用前面学的回溯算法,求出解集合,再用set或map去重。缺点:麻烦,易超时。

优解:在搜索中直接去重。(使用过的元素不再使用)

树层去重,树枝去重

树层,横向避免重复,先排序,相同的挨着,前面遍历过,就不用再遍历了。

树枝可以,纵向是一个组合内的元素,可以重复。

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 + candidate[i] <= target; i++){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(candidate,target,sum,i + 1,used);//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();sort(candidates.begin(),candidates.end());backtracking(candidates,target,0,0,used);return result;}
};

分割回文串

class Solution{
private:vector<vector<string>>result;vector<string>path;//回溯函数void backtracking(const string& s, int startIndex){if(startIndex >= s.size()){//到达字符串末尾,终止本次回溯result.push_back(path);//result存放最终的所有路径,即分割结果return;}for(int i = startIndex; i < s.size(); i++){if(isPalindrome(s,startIndex,i)){//是回文string str = s.substr(startIndex, i - startIndex + 1);path.push_back(str);//添加进path}else{continue;//不是,跳过}backtracking(s, i + 1);//进入i+1path.pop_back();//清空path}}//判断是不是回文串,前后双指针,正反向同步走bool isPalindrome(const string& s,int start,int end){for(int i = start, j = end; i < j; i++; j--){if(S[i] != s[j]){return false;}}return true;}public://分割函数vector<vector<string>>partition(string s){result.clear();//清除结果集path.clear();//清除路径内所有字符backtracking(s,0);//从下标0处开始对字符串分割,调用回溯函数return result;//返回结果} 
};

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

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

相关文章

Python之:如何使用双重for循环输出九九乘法表?

文章目录 前言源代码 前言 如何用for双重循环输出九九乘法表&#xff1f;教程来咯&#xff01; 源代码 代码如下&#xff1a; for i in range(1, 10):for j in range(1, i1):print(f{j}{i}{i*j}\t, end)print()你学会了吗&#xff1f;效果如下&#xff1a; 想看详解&#…

【贪心算法】代码随想录算法训练营第三十二天 |122.买卖股票的最佳时机II,55.跳跃游戏,45.跳跃游戏II(待补充)

122.买卖股票的最佳时机II&#xff08;未观看&#xff0c;动态待补充&#xff09; 1、题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 2、文章讲解&#xff1a;代码随想录 3、题目&#xff1a; 给定一个数组&#xff0c;它的…

猫头虎分享已解决Bug || DNS解析问题(DNS Resolution Issue):DNSLookupFailure, DNSResolveError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

谈谈Lombok的坑

Lombok 是一个 Java 库&#xff0c;通过注解的方式在编译时自动为类生成 getter、setter、equals、hashCode 等方法&#xff0c;以简化代码和提高开发效率。本文主要谈谈代码简化背后的代价。 引入Lombok之前是怎么做的 IDE中添加getter/setter, toString等代码&#xff1a; …

springboot190基于springboot框架的工作流程管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

.target勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言&#xff1a; 网络安全威胁如勒索病毒已经成为企业和个人数据安全的重大挑战之一。.target勒索病毒作为其中的一种&#xff0c;以其高度复杂的加密算法和迅速变化的攻击手法备受关注。本文将深入介绍.target勒索病毒的特点&#xff0c;探讨如何有效地恢复被加密的数据文件…

【学网攻】 第(28)节 -- OSPF虚链路

系列文章目录 目录 系列文章目录 文章目录 前言 一、什么是OSPF虚链路&#xff1f; 二、实验 1.引入 实验目标 实验背景 技术原理 实验步骤 实验设备 实验拓扑图 实验配置 扩展 实验拓扑图 实验配置 实验验证 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻…

【从Python基础到深度学习】4. Linux常用命令(进阶)

接上篇 【从Python基础到深度学习】4. Linux 常用命令-CSDN博客 1.文件查找 - find 命令 find [搜索路径] [搜索条件] [操作]1.1 常用选项和参数 -name&#xff1a;按文件名搜索。 find 命令的 -name 选项可以接受通配符来匹配文件名。通配符可以帮助你更灵活地搜索文件名&a…

尚硅谷最新Node.js 学习笔记(三)

目录 六、Node.js 模块化 6.1、介绍 什么是模块化与模块&#xff1f; 什么是模块化项目&#xff1f; 模块化好处 6.2、模块暴露数据 模块初体验 暴露数据 6.3、导入&#xff08;引入&#xff09;模块 6.4、导入模块的基本流程 6.5、CommonJS规范 七、包管理工具 7…

第11集《佛说四十二章经》

和尚尼慈悲&#xff01;诸位法师、诸位居士&#xff0c;阿弥陀佛&#xff01; 请大家打开讲议第十四面&#xff0c;第二十七章、无着得道。 唯识学说&#xff0c;我们生命的相貌是恒转如瀑流&#xff0c;生命是一条没有止尽的水流&#xff0c;从过去流到现在&#xff0c;再从…

CSS设置盒子阴影

语法 box-shadow: *h-shadow v-shadow blur spread color* inset; 注释: box-shadow向框添加一个或多个阴影. 该属性是由逗号分隔的阴影列表,每个阴影由2-4个长度值、可选的颜色值及可选的inset关键词来规定。省略长度的值是0。 外阴影 a、给元素右边框和下边框加外阴影——把…

flask+python儿童福利院管理系统pycharm毕业设计项目

本系统解决了儿童福利院管理事务中的主要问题&#xff0c;包括首页、个人中心、爱心人士管理、员工管理、后勤人员管理、儿童信息管理、院所风采管理、活动管理、食谱管理、领养流程管理、政策法规管理、楼栋管理、宿舍管理、领养申请管理、义工申请管理、捐赠信息管理、宿舍物…