【LeetCode】22、括号生成

发布于:2025-09-05 ⋅ 阅读:(13) ⋅ 点赞:(0)

题目:

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1
输出:["()"]

提示:

  • 1 <= n <= 8

解题思路:

通过递归构建符合条件的有效括号字符串,并在过程中始终遵守有效括号的规则,最终收集所有符合条件的组合。

代码解释:

result表示结果数组;

current表示当前数组;

total表示总的组合数;

代码:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
void backtrack(char** result, int* returnSize, char* current, int open, int close, int n) {
    if (strlen(current) == 2 * n) 
    {
        result[*returnSize] = (char*)malloc(sizeof(char) * (2 * n + 1));
        strcpy(result[*returnSize], current);
        (*returnSize)++;
        return;
    }
    if (open < n) 
    {
        current[strlen(current)] = '(';
        backtrack(result, returnSize, current, open + 1, close, n);
        current[strlen(current) - 1] = '\0';
    }
    if (close < open) 
    {
        current[strlen(current)] = ')';
        backtrack(result, returnSize, current, open, close + 1, n);
        current[strlen(current) - 1] = '\0';
    }
}
int catalan(int n) 
{
    long long result = 1;
    for (int i = 0; i < n; i++) {
        result = result * 2 * (2 * i + 1) / (i + 2);
    }
    return (int)result;
}
char** generateParenthesis(int n, int* returnSize) 
{
    *returnSize = 0;
    int total = catalan(n);
    char** result = (char**)malloc(sizeof(char*) * total);
    char* current = (char*)calloc(2 * n + 1, sizeof(char));
    backtrack(result, returnSize, current, 0, 0, n);
    free(current);
    return result;
}


网站公告

今日签到

点亮在社区的每一天
去签到