当前位置: 首页 > news >正文

Day23 | 组合总和、组合总和Ⅱ、分割回文串

组合总和

[https://programmercarl.com/0039.组合总和.html#算法公开课]

解法

如果允许使用重复数字的话递归时就不要把索引加一了,而是传原来的索引。但是这样就有用终止条件来避免无限递归:当sum大于target的时候continue(不能break不然有些情况会错过正确组合)。

class Solution {
private:vector<int> group;vector<vector<int>> res;
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {backTravel(candidates,target,0,0);return res;}void backTravel(vector<int> &candidates,int target,int index,int sum){if(index == candidates.size()) return;if(sum == target){res.push_back(group);return;}for(int i = index;i < candidates.size();i++){if(sum + candidates[i] > target) continue;group.push_back(candidates[i]);backTravel(candidates,target,i,sum + candidates[i]);group.pop_back();}}
};

组合总和Ⅱ

[https://programmercarl.com/0040.组合总和II.html]

解法

需要在树层上进行去重,使用used数组记录元素是否被使用过。如果该元素与上一个元素相等,但上一个元素的used记录是使用过,那说明是在同一个数枝上,这样是允许的;如果上一个元素没被使用过,那说明这个重复是树层上的,不被允许,直接continue。

class Solution {
private:vector<int> group;vector<vector<int>> res;
public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {sort(candidates.begin(),candidates.end());vector<int> used(candidates.size(),0);BackTravel(candidates,target,0,0,used);return res;}void BackTravel(vector<int>& candidates,int target,int index,int sum,vector<int>& used){if(sum > target) return;if(sum == target){res.push_back(group);return;}for(int i = index;i < candidates.size();i++){if(i > 0 && candidates[i] == candidates[i - 1] && used[i-1] == 0) continue;group.push_back(candidates[i]);sum += candidates[i];used[i] = 1;BackTravel(candidates,target,i+1,sum,used);group.pop_back();sum -= candidates[i];used[i] = 0;}}
};

分割回文串

[https://programmercarl.com/0131.分割回文串.html#思路]

解法

很有意思,这道题竟然也能用到回溯算法。index算是分割的隔板,index之前的是已经加入到path里的子串,后面用i去找符合条件的子串。其中每划分出一个子串,就用函数判断是不是回文段,不是直接continue结束这层for循环,因为这种分割方式不可能出现符合条件的情况了;如果是回文段,加入path。这样当index挪动到最后,得到的path就已经是符合条件的情况。不需要在判断path是不是都是回文子串了

class Solution {
private:vector<string> path;vector<vector<string>> res;
public:vector<vector<string>> partition(string s) {backtravel(s,0);return res;}void backtravel(string &s,int index){if(index >= s.size()){res.push_back(path);return;}for(int i = index;i < s.size();i++){if(ishuiwen(s,index,i)){path.push_back(s.substr(index,i - index + 1));}else{continue;}backtravel(s,i + 1);path.pop_back();}return;}bool ishuiwen(string &s,int start,int now){if(start == now) return true;int i = start;int j = now;while(i < j){if(s[i] != s[j]) return false;i++;j--;}return true;}
};

http://www.jsqmd.com/news/598987/

相关文章:

  • C# WinForm图书管理系统(含完整报告)|基于SQL Server三层架构的图书信息增删改查解决方案
  • Go Context 信号传播机制与取消任务设计
  • 《为什么90%的数字孪生都是假的?》
  • **MQTT协议实战:从零搭建轻量级物联网消息中间件系统**在当前万物互联的时代,**MQ
  • 从‘局部线性模型’到代码:拆解引导滤波(Guided Filter)的数学之美与工程实现
  • Win10/Win11远程桌面报错‘函数不受支持’?5分钟搞定CredSSP加密Oracle修正
  • C++标准库里为什么没有网络库?
  • SeaweedFS高可用集群部署实战
  • 淨界法師 :有福報的人講話厚道,不會傷人,他處處為別人著想
  • 亚马逊德国站VAT发票自动筛选:手把手教你用浏览器控制台JS代码搞定(附Edge/Chrome/Firefox全版本)
  • 安卓党狂喜!纯净无广 BT/磁力/HTTP/FTP满速下载
  • 如何快速将网页转换为Figma设计稿:5分钟完成HTML到Figma的无缝转换
  • 2025届最火的六大AI辅助写作工具推荐榜单
  • 金融级权限设计实战:用RBAC3模型搞定互斥角色、基数限制与操作审计
  • 上午算法相关—计算机等级考试—软件设计师考前备忘录—东方仙盟
  • AI时代传统程序员是否会被替代?深入剖析篇章一
  • 《港口三维空间智能系统完整方案》——从“看不清”到“全域掌控”,港口进入空间智能时代
  • 2025届毕业生推荐的降重复率神器解析与推荐
  • 10、Ansible 生产级故障排查与运维最佳实践
  • 喜马拉雅VIP音频下载器:3分钟学会离线保存付费有声小说
  • Anaconda3新建环境也卡solving?可能是你的Conda版本和镜像源该更新了
  • 9. C++14新特性-std::tuple 的按类型寻址 (Type-based Tuple Addressing)
  • 专业级批量二维码扫描工具V2.0|高精度图片二维码批量识别软件
  • 比亚迪3月销量突破30万辆,获中国新能源车企销量冠军
  • 哈希表入门教程:从零搭建完整结构
  • crypto-js —— 前端数据安全的 JavaScript 加密利器
  • IP-vlan实验报告
  • Massachusetts:1类道路语义分割数据集Massachusetts数据集包括1个类别类别分别是:road 共计图片809张,分辨率是1500x1500像素数据集是VOC格式训练集图
  • 【全网最细・已实测】Dify 调用内网接口报 403/Connection refused 完整踩坑实录 + 终极解决方案
  • e1547:让社区浏览体验回归纯粹的定制化浏览器