完整教程:【LeetCode】22、括号生成

题目:

数字 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;
}

posted @ 2025-09-06 13:40  wzzkaifa  阅读(6)  评论(0)    收藏  举报