【C语言】【Leetcode】【递归】22. 括号生成

文章目录


题目

链接: https://leetcode.cn/problems/generate-parentheses/description/

思路

我们可以通过回溯递归算法求解

如果左括号数量不大于n,我们可以放一个左括号。

如果右括号数量小于左括号的数量,我们可以放一个右括号。

str 来记录每一个元素

对于递归我们可以利用这样一个方法函数 generate

我们可以粗略地把这个过程理解为下图

然后我们时不断在右边添加左括号或右括号的,所以在调用 generate 时需要借用一个索引 index


代码实现

需要注意的是下面代码中元素 str 创建时用的是 calloc 并且还多创建了一个空间原因是在赋值给 result 时用的是 strcpy 它是以尾部地0判断结束的,而 calloc 中的每一个元素都为0,

如果要用 malloc 必须手动在末尾添加上一个0来做结束

也可以改变读取方式,不用 strcpy ,用循环赋值的方法也是一样的

csharp 复制代码
void generate(int left, int right, int n, char* str, int index, char** result,
              int* returnSize) {
    if (index == 2 * n) {
        result[(*returnSize)] = (char*)calloc((2 * n + 1), sizeof(char));
        strcpy(result[(*returnSize)++], str);
        return;
    }
    // 最多放n个左括号,如果左括号数量不大于 n,可以放一个左括号
    if (left < n) {
        str[index] = '(';
        generate(left + 1, right, n, str, index + 1, result, returnSize);
    }
    // 右括号只能放左括号右边,不能先放右括号如果右括号数量小于左括号的数量,可以放一个右括号
    if (right < left) {
        str[index] = ')';
        generate(left, right + 1, n, str, index + 1, result, returnSize);
    }
}
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
char** generateParenthesis(int n, int* returnSize) {
    char* str = (char*)calloc((2 * n + 1), sizeof(char));
    char** result =
        (char**)malloc(sizeof(char*) * 1430); // n最大为8时的元素个数
    *returnSize = 0;
    generate(0, 0, n, str, 0, result, returnSize);
    return result;
}
相关推荐
Brilliantwxx3 分钟前
【STM32】 I2C_EEPROM_test 工程(实战篇)
开发语言·stm32·单片机·嵌入式硬件·ecmascript
清水白石0088 分钟前
Python 异步编程深度解析:Cancellation 到底是异常还是控制信号?从 asyncio 取消机制到企业级事务设计最佳实践
开发语言·python
kolyle14 分钟前
万级 QPS 下的 Token 分发系统架构:从 0 到 1 跑通 AI 时代的“水电煤“
开发语言·人工智能·系统架构·token·qps·极智词元·大模型私有化部署
caoerzhong27 分钟前
JeeWMS 开源仓库管理系统 GPL-3.0 合规指南:Java WMS 二次开发前必须弄清的授权边界
java·开发语言·开源·vue
Patrick在香港28 分钟前
Python 审计香港开放数据目录:两个端点差 10 倍,只有 9.3% 的资源标了「最后修改时间」
开发语言·数据库·python·数据分析·api·数据治理·开放数据
Sylvia33.1 小时前
火星数据体育API|一站式接入足球篮球电竞等18+项目实时数据
java·开发语言·python·websocket·游戏
SuperByteMaster1 小时前
freertos 任务创建方式
c语言
Data_Journal1 小时前
使用 AutoScraper 进行网页抓取:分步教程
大数据·开发语言·数据库·python·scrapy
yume_sibai2 小时前
12-Rust 性能优化指南(性能分析 + 内存优化 + SIMD + 并发优化 + 编译器优化 + 基准测试)
开发语言·性能优化·rust
萧瑟余晖2 小时前
Hibernate 核心原理与架构详解
开发语言·架构·hibernate