【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;
}
相关推荐
逝水无殇2 小时前
C# 异常处理详解
开发语言·后端·c#
旖-旎3 小时前
《LeetCode647 回文子串 || LeetCode 5 最长回文子串》
c++·算法·leetcode·动态规划·哈希算法
玖玥拾3 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#
铅笔侠_小龙虾4 小时前
Rust 学习目录
开发语言·学习·rust
云泽8084 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范
灯澜忆梦4 小时前
GO---可见性规则
开发语言·golang
逝水无殇5 小时前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
这是个栗子6 小时前
前端开发中的常用工具函数(八)
开发语言·前端·javascript
凤凰院凶涛QAQ6 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
研☆香6 小时前
为什么变量声明在赋值前也能使用?—— 深入理解 JavaScript 变量提升与作用域
开发语言·前端·javascript