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