括号生成
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
提示:
1 <= n <= 8
思路:
搜索
对n个'('和n个')'进行全排列,然后排除剩余的(的数量大于)的数量的情况,因为这样必然会有)匹配不上。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
void dfs(int* returnSize, char **ans, char *arr, int left, int right, int len, int n){
if(left == 0 && right == 0){
arr[len] = '\0';
ans[*returnSize] = malloc(20);
memset(ans[*returnSize], 0, 20);
strncpy(ans[(*returnSize)++] , arr, len + 1);
return ;
}
if(right < 0 || left < 0)
return ;
if(left > right)
return ;
arr[len] = '(';
dfs(returnSize, ans, arr, left - 1, right, len+1, n);
arr[len] = ')';
dfs(returnSize, ans, arr, left, right - 1, len+1, n);
}
char ** generateParenthesis(int n, int* returnSize){
char arr[20] = {0};
*returnSize = 0;
char **ans = (char **)malloc(sizeof(char *) * 1500);
arr[0] = '(';
dfs(returnSize, ans, arr, n-1, n, 1, n);
return ans;
}