代码随想录第二十三天(一刷C语言)|组合总数组合总数II分割回文串

创作目的:为了方便自己后续复习重点,以及养成写博客的习惯。

一、组合总数

思路:参考carl文档

        定义两个全局变量,二维数组result存放结果集,数组path存放符合条件的结果。(这两个变量可以作为函数参数传入)。题目中给出的参数,集合是candidates, 和目标值是target。终止只有两种情况,sum大于target和sum等于target。

ledcode题目:https://leetcode.cn/problems/combination-sum/

AC代码:

int* path;
int pathTop;
int** ans;
int ansTop;
//记录每一个和等于target的path数组长度
int* length;void backTracking(int target, int index, int* candidates, int candidatesSize, int sum) {//若sum>=target就应该终止遍历if(sum >= target) {//若sum等于target,将当前的组合放入ans数组中if(sum == target) {int* tempPath = (int*)malloc(sizeof(int) * pathTop);int j;for(j = 0; j < pathTop; j++) {tempPath[j] = path[j];}ans[ansTop] = tempPath;length[ansTop++] = pathTop;}return ;}int i;for(i = index; i < candidatesSize; i++) {//将当前数字大小加入sumsum+=candidates[i];path[pathTop++] = candidates[i];backTracking(target, i, candidates, candidatesSize, sum);sum-=candidates[i];pathTop--;}
}int** combinationSum(int* candidates, int candidatesSize, int target, int* returnSize, int** returnColumnSizes){//初始化变量path = (int*)malloc(sizeof(int) * 50);ans = (int**)malloc(sizeof(int*) * 200);length = (int*)malloc(sizeof(int) * 200);ansTop = pathTop = 0;backTracking(target, 0, candidates, candidatesSize, 0);//设置返回的数组大小*returnSize = ansTop;*returnColumnSizes = (int*)malloc(sizeof(int) * ansTop);int i;for(i = 0; i < ansTop; i++) {(*returnColumnSizes)[i] = length[i];}return ans;
}

二、组合总和II

思路:参考carl文档

        与组合总数的区别在于组合总和II中的candidates 每个数字在每个组合中只能使用一次,需要使用降重处理。

lecode题目:https://leetcode.cn/problems/combination-sum-ii/description/

AC代码:

int* path;
int pathTop;
int** ans;
int ansTop;
//记录ans中每一个一维数组的大小
int* length;
int cmp(const void* a1, const void* a2) {return *((int*)a1) - *((int*)a2);
}void backTracking(int* candidates, int candidatesSize,  int target, int sum, int startIndex) {if(sum >= target) {//若sum等于target,复制当前path进入if(sum == target) {int* tempPath = (int*)malloc(sizeof(int) * pathTop);int j;for(j = 0; j < pathTop; j++) {tempPath[j] = path[j];}length[ansTop] = pathTop;ans[ansTop++] = tempPath;}return ;}int i;for(i = startIndex; i < candidatesSize; i++) {//对同一层树中使用过的元素跳过if(i > startIndex && candidates[i] == candidates[i-1])continue;path[pathTop++] = candidates[i];sum += candidates[i];backTracking(candidates, candidatesSize, target, sum, i + 1);//回溯sum -= candidates[i];pathTop--;}
}int** combinationSum2(int* candidates, int candidatesSize, int target, int* returnSize, int** returnColumnSizes){path = (int*)malloc(sizeof(int) * 50);ans = (int**)malloc(sizeof(int*) * 100);length = (int*)malloc(sizeof(int) * 100);pathTop = ansTop = 0;//快速排序candidates,让相同元素挨到一起qsort(candidates, candidatesSize, sizeof(int), cmp);backTracking(candidates, candidatesSize, target, 0, 0);*returnSize = ansTop;*returnColumnSizes = (int*)malloc(sizeof(int) * ansTop);int i;for(i = 0; i < ansTop; i++) {(*returnColumnSizes)[i] = length[i];}return ans;
}

三、分割回文串

思路:参考carl文档

        考虑切割并判断回文,递归用来纵向遍历,for循环用来横向遍历。切割问题的回溯搜索的过程和组合问题的回溯搜索类似。组合问题与切割问题的区别:

1、组合问题:选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中再选取第三个.....。

2、切割问题:切割一个a之后,在bcdef中再去切割第二段,切割b之后在cdef中再切割第三段.....。

        全局变量数组path存放切割后回文的子串,二维数组result存放结果集。 递归函数参数还需要startIndex,切割过的地方,不能重复切割,和组合问题一样。递归参数需要传入startIndex,表示下一轮递归遍历的起始位置,而startIndex就是切割线。

ledcode题目:https://leetcode.cn/problems/palindrome-partitioning/description/

AC代码:

char** path;
int pathTop;
char*** ans;
int ansTop = 0;
int* ansSize;//将path中的字符串全部复制到ans中
void copy() {//创建一个临时tempPath保存path中的字符串char** tempPath = (char**)malloc(sizeof(char*) * pathTop);int i;for(i = 0; i < pathTop; i++) {tempPath[i] = path[i];}//保存tempPathans[ansTop] = tempPath;//将当前path的长度(pathTop)保存在ansSize中ansSize[ansTop++] = pathTop;
}//判断字符串是否为回文字符串
bool isPalindrome(char* str, int startIndex, int endIndex) {//双指针法:当endIndex(右指针)的值比startIndex(左指针)大时进行遍历while(endIndex >= startIndex) {//若左指针和右指针指向元素不一样,返回Falseif(str[endIndex--] != str[startIndex++])return 0;}return 1;
}//切割从startIndex到endIndex子字符串
char* cutString(char* str, int startIndex, int endIndex) {//开辟字符串的空间char* tempString = (char*)malloc(sizeof(char) * (endIndex - startIndex + 2));int i;int index = 0;//复制子字符串for(i = startIndex; i <= endIndex; i++)tempString[index++] = str[i];//用'\0'作为字符串结尾tempString[index] = '\0';return tempString;
}void backTracking(char* str, int strLen,  int startIndex) {if(startIndex >= strLen) {//将path拷贝到ans中copy();return ;}int i;for(i = startIndex; i < strLen; i++) {//若从subString到i的子串是回文字符串,将其放入path中if(isPalindrome(str, startIndex, i)) {path[pathTop++] = cutString(str, startIndex, i);}//若从startIndex到i的子串不为回文字符串,跳过这一层 else {continue;}//递归判断下一层backTracking(str, strLen, i + 1);//回溯,将path中最后一位元素弹出pathTop--;}
}char*** partition(char* s, int* returnSize, int** returnColumnSizes){int strLen = strlen(s);//因为path中的字符串最多为strLen个(即单个字符的回文字符串),所以开辟strLen个char*空间path = (char**)malloc(sizeof(char*) * strLen);//存放path中的数组结果ans = (char***)malloc(sizeof(char**) * 40000);//存放ans数组中每一个char**数组的长度ansSize = (int*)malloc(sizeof(int) * 40000);ansTop = pathTop = 0;//回溯函数backTracking(s, strLen, 0);//将ansTop设置为ans数组的长度*returnSize = ansTop;//设置ans数组中每一个数组的长度*returnColumnSizes = (int*)malloc(sizeof(int) * ansTop);int i;for(i = 0; i < ansTop; ++i) {(*returnColumnSizes)[i] = ansSize[i];}return ans;
}

全篇后记:

        一刷的话基本上做不出来什么题目,照着carl的文档进行理解然后几乎是照着文档将题目AC的,但是这些似乎都不重要,有时候坚持会更好。

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

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

相关文章

观海微电子---AF、AG、AR 的差别和作用

一、名称解释及原理 1.AF ---- Anti-fingerprint&#xff0c;中文为抗指纹。一般 SiO2AF 材料&#xff08;DON&#xff0c;M4、道康宁 AF 材料&#xff09;&#xff0c;一般采用真空蒸发镀膜法。 原理&#xff1a;AF 防污防指纹玻璃是根据荷叶原理&#xff0c;在玻璃外表面涂制…

无需公网IP!Apache服务器本地部署与内网穿透实现公网访问

Apache服务安装配置与结合内网穿透实现公网访问 文章目录 Apache服务安装配置与结合内网穿透实现公网访问前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpo…

理解 Python 的 for 循环

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 在本篇博客中&#xff0c;我们将讨论 Python 中 for 循环的原理。 我们将从一组基本例子和它的语法开始&#xff0c;还将讨论与 for 循环关联的 else 代码块的用…

curl --compressed报错,此版本不支持此命令

出现这个问题是因为微软windows自带的curl不支持这个选项,验证如下 执行where curl 时,可以看到输出为 C:\Windows\System32\curl.ee 解决方法是使用其它curl,下载地址如下 curl for Windows https://curl.se/windows/ 然后把安装目录的bin目录放到path环境变量里最开始, 让…

德国进口高速主轴电机在机器人上的应用及选型方案

随着机器人技术的日新月异&#xff0c;高速主轴电机在机器人领域的应用也日趋广泛。德国进口的SycoTec高速主轴电机&#xff0c;以其高转速、高精度、高刚度的特点&#xff0c;在机器人的切割、铣削、钻孔、去毛刺等加工应用中发挥着关键作用。 一、高速主轴电机的特点 SycoT…

SPM/SCM 流量跟踪体系

SPM SPM&#xff08;shopping page mark&#xff0c;导购页面标记&#xff09; 是淘宝社区电商业务&#xff08;xTao&#xff09;为外部合作伙伴&#xff08;外站&#xff09;提供的跟踪引导成交效果数据的解决方案 注&#xff1a;也有解释 SPM 为超级位置模型(Super Position…

基于Arduino的音乐喷泉设计(论文+源码)

1.系统设计 整个Audio Visualizer系统通过锂电池电源进行供电&#xff0c;当Arduino控制板通过蓝牙音频接收器模块与手机蓝牙完成匹配后&#xff0c;然后通过蓝牙音频接收器模块接收来自手机的音乐&#xff0c;接着通过对音乐进行FFT变换来得到音乐的频率数据&#xff0c;接着…

qt-C++笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解

qt-C笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解 code review! 文章目录 qt-C笔记之识别点击鼠标右键、点击位置以及Qt坐标系详解1.示例运行2.event->pos();详解3.event->pos()的坐标系原点4.Qt中的坐标系详解5.QMainWindow::mousePressEvent(event);详解 1.示例…

全球与中国协作机器人市场:增长趋势、竞争格局与前景展望

协作机器人&#xff08;cobot&#xff09;是一种设计用于与人类协作和互动工作的机器人。协作机器人配备了各种感测器和先进技术&#xff0c;以确保与人类的安全协作。协作机器人应用于多种产业&#xff0c;包括制造业、医疗保健、物流和农业。协作机器人可用于需要人工监督和介…

安装配置JDK1.8

JDK1.8的下载及配置 1.进入甲骨文官网甲骨文官网往下翻找到java8并且点击windows. 2.下载Java8必须登录账号 3下载完后点击进入安装&#xff0c;直接下一步就可以&#xff0c;记住这个路径。 4.右击我的电脑进入环境配置&#xff0c;新增变量。 CLASSPATH .;%JAVAHOME%\lib;…

终端安全管理软件是监控软件吗

有些人在后台问&#xff0c;终端安全管理软件是监控软件吗&#xff1f; 先回答&#xff0c;是监控软件。 因为它具有监控的功能&#xff0c;在很大程度上&#xff0c;是可以用来当做监控软件来用的。 终端安全管理软件是一种集中管理终端设备的软件工具&#xff0c;可以在企业…

科研试剂实验室Tubulysin M微管蛋白抑制剂936691-46-2

Tubulysin M 微管蛋白抑制剂 M 936691-46-2 英文名称&#xff1a;Tubulysin M 中文名称&#xff1a;微管蛋白抑制剂 M 化学名称&#xff1a;(2S,4R)-4-[[2-[(1R,3R)-1-乙酰氧基-4-甲基-3-[甲基-[(2S,3S)-3-甲基-2-[[(2R) -1-甲基哌啶-2-羰基]氨基]戊酰基]氨基]戊基]-1,3-噻唑…