代码随想录算法训练营day23 | 39. 组合总和、40.组合总和II、131.分割回文串

news/2025/3/5 23:24:08/文章来源:https://www.cnblogs.com/coderjxj/p/18752442
  1. 组合总和
点击查看代码
class Solution {
public:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& candidates, int &target, int sum, int startIndex) {//由于for循环条件已经提前做了递归终止判断,故这里不用再加//if(sum > target) return;if(sum == target) {result.push_back(path);}//&& sum + candidates[i] <= sum,剪枝,由于candidates数组经过排序//故若上一层传下来的sum + 本层的某一元素已经大于target,则+本元素的后//续元素也必然大于target,故提前结束本层循环遍历,也不再往下递归for(int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; ++i) {path.push_back(candidates[i]);//下一层的startIndex仍为i,因为同一个数字可重复选取backtracking(candidates, target, sum + candidates[i], i);path.pop_back();}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {//先排序,方便后续剪枝sort(candidates.begin(), candidates.end());backtracking(candidates, target, 0, 0);return result;}
};

注意本题的剪枝操作,同时注意当题目可以重复选取某一元素时,传入下一层函数的startIndex值的选取

40.组合总和II
去重解法一:使用used数组

点击查看代码
class Solution {
public:vector<vector<int>> result;vector<int> path;vector<bool> used;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) {//去重逻辑:树枝不去重,树层去重if(i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) continue;path.push_back(candidates[i]);used[i] = 1;//此处i+1是因为candidates中的每个数字在每个组合中只能使用一次backtracking(candidates, target, sum + candidates[i], i + 1);used[i] = 0;path.pop_back();}}vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {used.resize(candidates.size(), false);sort(candidates.begin(), candidates.end());backtracking(candidates, target, 0, 0);return result;}
};

去重解法二:直接使用startIndex进行去重

点击查看代码
class Solution {
public: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) {//去重逻辑:树枝不去重,树层去重//i = startIndex为本树层的第一个元素,不可能重复,若此时//candidates[i] == candidates[i - 1],说明是树枝上的重复,无需去重//当i > startIndex且candidates[i] == candidates[i - 1],此时才是树层上重复,需要去重if(i > startIndex && candidates[i] == candidates[i - 1]) continue;path.push_back(candidates[i]);//此处i+1是因为candidates中的每个数字在每个组合中只能使用一次backtracking(candidates, target, sum + candidates[i], i + 1);path.pop_back();}}vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {sort(candidates.begin(), candidates.end());backtracking(candidates, target, 0, 0);return result;}
};

131.分割回文串

点击查看代码
class Solution {
public:vector<vector<string>> result;vector<string> path;bool isHuiWen(string &s, int left, int right) {while(left < right) {if(s[left] != s[right]) return false;left++;right--;}return true;}void backtracking(string &s, int startIndex){if(startIndex == s.size()) {  //能到达这个if判断的说明已切的均为回文串,否则不会递归到这result.push_back(path);return;}for(int i = startIndex; i < s.size(); ++i) {if(isHuiWen(s, startIndex, i)) {path.push_back(s.substr(startIndex, i - startIndex + 1));}else continue; //不是回文串则继续往后切,不进行递归,是回文串才往下递归backtracking(s, i + 1);path.pop_back();}}vector<vector<string>> partition(string s) {backtracking(s, 0);return result;}
};

每一层for循环中,[startIndex, i]区间即为所切割的区间,需要判断这个区间的子串是否为回文串,是的话则放入path中,不是的话再往后切割

2025/03/05

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

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

相关文章

2023-3-5-ai试用

今天使用了ai来做简单的项目,这是我发给ai的话语这是相应的结构图,按照ai的回答做出,相应的依赖我们能够实现登录以及相应的查询,不过也有一些数据取不到,有一些bug,其他功能代码ai没有给出,需要我们进一步索要,不过也能看出ai是可以用于做项目了

车辆运维管理行业洞察与竞品分析

1. 前言 车辆运维管理是指对车辆进行日常维护、故障处理、性能监测、成本控制等一系列活动的管理。随着物联网、大数据、人工智能等技术的发展,车辆运维管理软件和解决方案的市场竞争日益激烈。 2. 确定目标通过产品差异化定位,找到竞争者的差异,打造自己的优势,抢占市场份…

go语言实现终端里的倒计时

最近在更新系统的时候发现pacman的命令行界面变了,我有很久没更新过设备上的Linux系统了,所以啥时候变的不好说。但这一变化成功勾起了我的好奇心。新版的更新进度界面如下:新的更新进度界面能同时显示多个进度条,而且并没有依靠ncurses这个传统的TUI库。为啥我能断定没有用…

备份是个好习惯

题目环境启动以后页面回显了一行字符串,丢进随波逐流里面以后发现解密不出来,如果有知道的大佬辛苦留言一下没啥思路,想到题目名字叫备份是个好习惯,说不定网页目录下真有bak文件,于是就拿御剑扫描一下扫完以后还真有打开以后就是这样一段代码点击查看代码 接下来就是代码…

使用 Net 处理 Excel 文件的时间列

前言最近,处理Excel的情况比较多,然后,就碰到了时间列,读取出来时中文,保存到数据库中着实麻烦,就找了下如何解决这个问题。正文1.这是读取Excel时候,调试的时候,时间列的格式,如下图:2.分享下原始读取Excel的公共方法,其实,也只能说这个方法写的有问题,所有列都按…

HTB Sherlock Easy Noted wp

靶场介绍:Simon, a developer working at Forela, notified the CERT team about a note that appeared on his desktop. The note claimed that his system had been compromised and that sensitive data from Simons workstation had been collected. The perpetrators per…

从Postman到Apipost:我的动态参数测试实战踩坑记

从Postman到Apipost:我的动态参数测试实战踩坑记作为全栈开发工程师,我最近在开发用户中心模块时遇到了一个棘手问题:如何高效测试包含复杂参数的API接口?我和团队小伙伴都习惯用Postman,直到这次让我们差点加班的"动态参数事件"... 第1次翻车:Postman的陷阱 记…

Claude 3.7登顶webdev榜首,国内怎么使用Claude 3.7

Claude 3.7 Sonnet 以 1363.7分 的竞技场评分位列榜首,较第二名(同为Anthropic的Claude 3.5 Sonnet)甩开116.5分,远超榜单前十其他模型的分差水平(通常仅相差几分至几十分)。Claude3.7登顶webdev榜首 Claude 3.7 Sonnet 以 1363.7分 的竞技场评分位列榜首,较第二名(同为…

JavaWeb学习(七)

JavaWeb学习(七):Web后端开发 —— Maven 目录JavaWeb学习(七):Web后端开发 —— Maven概念安装IDEA 集成 Maven依赖管理 本文为个人学习记录,内容学习自 黑马程序员概念Maven 是 apache 的一个开源项目,是一款用于管理和构建 Java 项目的工具作用:依赖管理:方便快捷…

浙江大学|第二弹来啦,65页《DeepSeek模型解读》,DeepSeek起源、应用、部署到未来展望全解读 | PDF免费下载

《DeepSeek模型解读》是由浙江大学MBA领学团队撰写的一份技术解析文档,系统介绍了国产大模型DeepSeek的核心特性与应用前景。**该文档以行业变革为背景,结合技术细节与场景案例,为读者展现了DeepSeek在人工智能领域的突破性进展。**《DeepSeek模型解读》是由浙江大学MBA领学…

浙江大学|153页《DeepSeek行业应用案例集》也来啦,DeepSeek居然已渗透到千行百业如此之深 | PDF免费下载

《DeepSeek行业应用案例集:解锁智能变革密码》由浙江大学信息技术中心发布,全面展示了DeepSeek人工智能技术在农业、制造业、金融、医疗、教育等领域的创新实践。本案例集通过40多个行业应用实例,揭示了DeepSeek如何以数据驱动和智能化解决方案推动行业转型升级,为从业者提…