数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1 输出:["()"]
思路:回溯法,如果左括号数量不大于 n,可以放一个左括号。 如果右括号数量小于左括号的数量且不大于n,可以放一个右括号。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#define MAXSIZE 1430//卡特兰数n=8时为1430
void generate(int left,int right,int n,char *str,int i,char **result,int *returnSize)
{
if(left==n && right==n)//左右括号都用完
{
result[(*returnSize)]=(char *)calloc((2*n+1),sizeof(char));
strcpy(result[(*returnSize)++],str);
return ;
}
if(left<n)//左括号没用完
{
str[i]='(';
generate(left+1,right,n,str,i+1,result,returnSize);
}
if(left>right && right<n)//右括号没用完且小于左括号
{
str[i]=')';
generate(left,right+1,n,str,i+1,result,returnSize);
}
}
char ** generateParenthesis(int n, int* returnSize){
char **result=(char **)malloc(sizeof(char *)*MAXSIZE);
char *str=(char *)calloc((2*n+1),sizeof(char));
*returnSize=0;
generate(0,0,n,str,0,result,returnSize);
return result;
}
如果有疑问可以留言,如果对您有帮助的话点个赞呗~