生成括号
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
思路就是回溯算法。刚接触回溯算法还是有点复杂的,递归里各种条件判断搞得头晕。还有就是C的百万参数。。。
/** * Return an array of size *returnSize. * Note: The returned array must be malloced, assume caller calls free(). */ void generate(char** a,char *s,int n,int in,int l,int r,int *top,int *size) { if(r==n) { s[*top]='\0'; strcpy(a[*size],s); (*size)++; return; } if((!in&&l==n)||(in&&l==r)) return; if(!in) { s[*top]='('; (*top)++; if(l<n) generate(a,s,n,0,l+1,r,top,size); generate(a,s,n,1,l+1,r,top,size); } else { s[*top]=')'; (*top)++; if(l<n) generate(a,s,n,0,l,r+1,top,size); generate(a,s,n,1,l,r+1,top,size); } (*top)--; } char** generateParenthesis(int n, int* returnSize) { int i,size=1; for(i=1;i<=n;i++) size=(4*i-2)*size/(i+1); *returnSize=size; char **a=(char **)malloc(sizeof(char *)*size); int len=2*n+1; for(i=0;i<size;i++) a[i]=(char *)malloc(sizeof(char)*len); char *s=(char *)malloc(sizeof(char)*len); int top=0,rear=0; generate(a,s,n,0,0,0,&top,&rear); return a; }