Day27 组合总数 + 组合总数Ⅱ + 分割回文串

ops/2024/10/21 3:18:11/

39 组合总数

题目链接:39. 组合总和 - 力扣(LeetCode)

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

思路:
使用回溯法,由于本题同一个数字可被重复选取,因此对于第i层,下一层还是从i开始遍历。

for (i...)
{...backtracking(...,i);...
}

终止条件就是sum >= target,从而避免无限递归

class Solution {
public: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();}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {backtracking(candidates, target, 0, 0);return result;}
};

40 组合总数Ⅱ

题目链接:40. 组合总和 II - 力扣(LeetCode)

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次

注意: 解集不能包含重复的组合。

输入: candidates = `[10,1,2,7,6,1,5]`, target = `8`,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]

参考题解:
代码随想录 (programmercarl.com)

思路:本题与上题类似,每个元素使用一次,下次从i + 1开始即可。难点在于去重,例如如上输入,可能出现[1,7][7,1],第一个1下标为1,第二个1下标为5。

本题可先将candidates排序,然后对于深度遍历时,可以取相同元素,对于下一个循环遍历,不可以取相同元素。此次使用了used来判断。

建议查看【代码随想录】题解,进一步理解。

class Solution {
public: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++) //剪枝{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);used[i] = false;sum -= candidates[i];path.pop_back();}}vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {vector<bool> used(candidates.size(), false);sort(candidates.begin(), candidates.end());backtracking(candidates, target, 0, 0, used);return result;}
};

131 分割回文串

题目链接:131. 分割回文串 - 力扣(LeetCode)

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

参考题解:
代码随想录 (programmercarl.com)

思路:
本题进行分割的时候,很难想到如何和回溯挂钩,具体看下图。

在这里插入图片描述

class Solution {
public:vector<vector<string>> result;vector<string> path; bool ishw(const string& s, int start, int end){int i = start, j = end;while(i < j){if(s[i] != s[j]) return false;i++;j--;}return true;}void backtracking (const string& s, int startIndex){if(startIndex >= s.size()){result.push_back(path);return;}for(int i = startIndex; i < s.size(); i++){if(ishw(s, startIndex, i)){string str = s.substr(startIndex, i - startIndex + 1);path.push_back(str);}else{continue;}backtracking(s, i + 1);path.pop_back();}}vector<vector<string>> partition(string s) {backtracking(s, 0);return result;}
};

http://www.ppmy.cn/ops/37762.html

相关文章

基于Transformer网络的多步预测模型

包括完整流程数据代码处理&#xff1a; 多步预测数据集制作、数据加载、模型定义、参数设置、模型训练、模型测试、预测可视化、多步预测、模型评估 ● 环境框架&#xff1a;python 3.9 pytorch 1.8 及其以上版本均可运行 ● 使用对象&#xff1a;论文需求、毕业设计需求者…

基于树莓派的六足机器人方案设计+源代码+工程内容说明

文章目录 源代码下载地址项目介绍项目内容说明简单预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 项目内容说明 hardware为项目相关硬件设计 机械结构为六足机器人的3d建模工程&#xff0c;包括本体和云台遥控器在ESP32最小开发板上集成了MPU605…

数字化校园的发展阶段

现代化技能虽然能很大程度上给人们日子带来很大的便利&#xff0c;可是许多新兴的科技被人们所接纳需求一个按部就班的进程。数字化学校也是如此。把高新科技引入到学校中&#xff0c;完全推翻之前的教育形式&#xff0c;关于学校来说也是一个巨大的挑战。所以数字化学校也不可…

信息安全-古典密码学简介

目录 C. D. Shannon: 一、置换密码 二、单表代替密码 ① 加法密码 ② 乘法密码 ③密钥词组代替密码 三、多表代替密码 代数密码 四、古典密码的穷举分析 1、单表代替密码分析 五、古典密码的统计分析 1、密钥词组单表代替密码的统计分析 2、英语的统计规…

【Linux】17. 进程间通信 --- 管道

1. 什么是进程间通信(进程间通信的目的) 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了…

【Python】numpy.ptp()

numpy.ptp() 函数是 NumPy 库中的一个有用函数&#xff0c;用于计算数组中的“峰到峰”&#xff08;peak-to-peak&#xff09;值&#xff0c;即数组中的最大值与最小值之差。这个函数可以帮助快速评估数组中数据的变化范围&#xff0c;常用于信号处理、数据分析等领域中&#x…

《深入理解kafka-核心设计与实践原理》第四章:主题和分区

第四章&#xff1a;主题和分区 4.1 主题管理 4.1.1 创建主题 4.2 KafkaAdminClient 4.3 分区管理 4.3.1 优先副本的选举 4.3.2 分区重分配(Partition Reassignment) 4.3.3 复制限流 4.3.4 修改副本因子 4.4 分区和性能的考量因素 第四章&#xff1a;主题和分区 4.1 主题管理 …

深入浅出带你搞懂-MOSFET栅极电阻

一、MOSFET简介 MOSFET是金属&#xff08;metal&#xff09;—氧化物&#xff08;oxide&#xff09;—半导体&#xff08;semiconductor&#xff09;场效应晶体管&#xff0c;属于电压控制电流型元件&#xff0c;是开关电路中的基本元件&#xff0c;其栅极&#xff08;G极&…