【代码随想录算法训练营第二十七天|39. 组合总和、40.组合总和II、131.分割回文串】

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

  • 39. 组合总和
  • 40.组合总和II
  • 131.分割回文串

题解参考y总的:http://www.acwing.com

39. 组合总和

我是一看就会,一写就废。先看代码:

class Solution {
public:vector<vector<int>> res;vector<int> path;vector<vector<int>> combinationSum(vector<int>& candidates, int target) {dfs(candidates,target,0);return res;}void dfs(vector<int>& candidates,int target,int n){if(target == 0){res.push_back(path);return;}if(n == candidates.size()) return;for(int i = 0;candidates[n] * i <= target;i++){dfs(candidates,target - candidates[n]*i,n + 1);path.push_back(candidates[n]);}for(int i = 0;candidates[n] * i <= target;i++){path.pop_back();}}
};

这道题目使用模板,关键在两点,一个是递归结束条件,一个是递归过程。首先是递归的结束条件,递归的结束条件就是和前面组合||一样,当target为0的时候,就结束。然后递归的过程,因为这里每个的元素是无限重复选取的,所以使用 i * candidates[n],这里n代表下标为n的元素。

40.组合总和II

看代码:

class Solution {
public:vector<vector<int>> res;vector<int> path;vector<vector<int>> combinationSum2(vector<int>& c, int target) {sort(c.begin(),c.end());dfs(c,target,0);return res;}void dfs(vector<int>& c,int target,int n){if(!target){res.push_back(path);return;}if(n == c.size()) return;int k = n + 1;while(k < c.size() && c[k] == c[n]) k++;int cnt = k - n;for(int i = 0;c[n] * i <= target && i <= cnt;i++){dfs(c,target - c[n] * i,k);path.push_back(c[n]);}for(int i = 0;c[n] * i <= target && i <= cnt;i++){path.pop_back();}}
}; 

和第一个一样,只不过这里的元素变成有限个数了,所以首先要统计元素个数,这里借鉴的y的,先从小到大排个序,然后统计一个元素重复的个数,还是使用candidates[n] * i,只要i不超过限制的个数就可以。还可以使用hash表来记录元素的个数。

131.分割回文串

看代码:

class Solution {
public:vector<vector<bool>> f;vector<vector<string>> res;vector<string> path;vector<vector<string>> partition(string s) {int n = s.size();f = vector<vector<bool>>(n,vector<bool>(n));for(int j = 0;j < n;j++){for(int i = 0;i <= j;i++){if(i ==j) f[i][j] = true;else if(s[i] == s[j]){if(i + 1 > j - 1 || f[i + 1][j - 1]) f[i][j] = true;}}}dfs(s,0);return res;}void dfs(string s,int n){if(n == s.size()) res.push_back(path);else{for(int i = n;i < s.size();i++){if(f[n][i]){path.push_back(s.substr(n,i - n + 1));dfs(s,i + 1);path.pop_back();}}}}
};

首先要判断一个字串是不是回文,首先第一种方法可以使用双指针的方法,一个从头开始,一个从尾开始,只要每次向中间走都字符都相同,那就是回文。
还有一种方法是:(下图来自acwing截图)
在这里插入图片描述首先判断i到j串,第i位和第j位是相同的字符,然后第i+1和第j-1也是回文,这就用的是递归,第一个方法用的是迭代。
f就是用来记录从第i到j位是否是回文串的。首先先构造f,如果是i==j,也就是单个字母,单个字母肯定的是回文;然后判断s[i]和s[j]是否相等,如果相等,再判断一下,如果是i + 1 > j - 1(也就是就只有两个字母),因为之前已经判断了s[i] == s[j]了,所以就两个字母肯定是回文;或者f[i + 1][j - 1]也是回文,那i到j就是回文。
构建好回文记录表f之后,开始走模板第一步,判断条件,什么时候才算一轮的结果,那必须是所有字母都走过一遍的时候,才是加入一个path的时候,然后然后i从n开始,i每次向后走,每次都判断一下n到i是否是回文,如果是的话就加入答案中。
回到一个地方:有人可能注意到,递归的时候dfs后面是i+1,而不是n+1,我个人认为是如果是n+1的话,因该就已有一条路径了,因为每次递归下去,再回溯到开始的时候,就是最开始的n,它就不变了,最后答案中估计也就一条正确答案,比如aab,可能答案只有:[[“a”,“a”,“b”]]其他没有了,因为回溯到开始n不变了。也就是说如果是n+1,外面的for循环相当于没有作用。
在这里插入图片描述

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

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

相关文章

云计算任务调度仿真05

今天再分享一个新的调度框架deeprm 本项目基于hongzimao/deeprm&#xff0c;原作者还著有论文Resource Management with Deep Reinforcement Learning 。 这个框架研究的也蛮多的&#xff0c;我在一篇博士论文中也看到了基于此的研究工作&#xff0c;但是论文题目忘记了。 运…

知识表示与推理:智能的核心

目录 前言1 知识的多重表达形式2 知识表示的本质3 知识表示的五个重要用途3.1 人可理解3.2 实体标识3.3 概念模型3.4 推理3.5 易于计算 4 知识的离散符号表示5 知识的连续向量表示结语 前言 人类心智的独特之处在于其具备获取、表示和处理知识的能力。这一本质特征体现在多个领…

jdk17新特性——Switch表达式增强

目录 一、Switch表达式增强示例一1.1、传统的方式 case中变量赋值示例1.2、jdk17 case中变量赋值示例 二、Switch表达式增强示例二2.1、传统的方式 case中值匹配多个示例2.2、jdk17 case中值匹配多个示例 三、Switch表达式增强示例三3.1、传统的方式 case中需要多行业务代码示例…

使用vue-pdf插件加载pdf

安装&#xff1a; // 安装这个版本&#xff0c;其它版本会有千奇百怪的错&#xff0c;这个版本和4.0.0都是可以的 cnpm install vue-pdf4.2.0// 安装pdfjs-dist cnpm install pdfjs-dist2.5.207 使用&#xff1a; // 我的css样式是pxToRem&#xff0c;友友们使用可能样式会有…

Nginx查看并发连接数

前言 需要依赖于nginx的http_stub_status_module模块http://nginx.org/en/docs/ 查看是否已经安装此模块 windows: linux: 添加/status 在server段内&#xff0c;添加如下配置&#xff1a; server {listen 80;server_name localhost;root "D:/WWW/local…

UG制图-视图与投影

当我们进入图纸页后&#xff0c;我们需要对产品进行投影然后进行标注 注意&#xff1a;如果是从零件3D中直接进入制图&#xff0c;默认情况下图框所在的图层是不显示的&#xff0c;我们可以通过菜单或者快捷键ctrl L进入图层设置模块&#xff0c;将图层170和173勾选为显示 我…

基于Altium Designer 10设计双层印刷电路板的详细步骤

基于Altium Designer 10设计双层印刷电路板的详细步骤 一、基于Altium Designer 10设计双层印刷电路板总纲二、、基于Altium Designer 10设计双层印刷电路原理图三、制作集成库(包括原理图、PCB封装库、PCB 3D库)1、新建集成库2、新建原理图库3、绘制原理图库(1)、手工绘制…

Spring 声明式事务 @Transactional(基本使用)

概述 声明式事务的实现很简单,只需要在需要事务的⽅法上添加 Transactional 注解就可以实现了.⽆需⼿动开启事务和提交事务,进⼊⽅法时⾃动开启事务,⽅法执⾏完会⾃动提交事务,如果中途发⽣了 没有处理的异常会⾃动回滚事务. Transactional 的基本使用 废话不多说&#xff0c;…

Linux的一些快捷键(hot keyboard)

Ctrl Alt t&#xff1a;打开bash&#xff08;就是命令框窗口&#xff09; Ctrl Alt F3~F6&#xff1a;打开tty终端&#xff08;纯命令行终端&#xff0c;每个Linux发行版不相同&#xff0c;我的是Ubuntu20版&#xff09; Alt F4&#xff1a;关闭当前窗口&#xff08;Windo…

【 CSS 】基础 2

“生活就像骑自行车&#xff0c;想要保持平衡&#xff0c;就得不断前行。” - 阿尔伯特爱因斯坦 CSS 基础 2 1. emmet 语法 1.1 简介 Emmet语法的前身是 Zen coding&#xff0c;它使用缩写&#xff0c;来提高 HTML / CSS 的编写速度&#xff0c; VSCode 内部已经集成该语法。…

怎么去除水中的溴酸盐

饮用水溴酸盐超标已成为影响公众健康的严重问题。本文从专业技术角度出发&#xff0c;分析了饮用水中溴酸盐的来源、危害以及去除工艺&#xff0c;并探讨了各种工艺的优劣势。目的在于为饮用水处理提供科学参考&#xff0c;以保障公众健康。 一、饮用水中溴酸盐的来源与危害 …

怎么使用AI人工智能抠图?不妨试试这样做

在数字时代的浪潮中&#xff0c;人工智能技术如春雨般悄然渗透到各个领域&#xff0c;其中尤以图像处理领域为甚。在这场技术的革新中&#xff0c;AI抠图应运而生&#xff0c;它凭借自动识别和提取图像中目标物体的神奇能力&#xff0c;成为图像处理领域的璀璨新星。通过背景与…