生成括号

给出 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;
}

 

posted @ 2018-07-18 10:31  onlyandonly  阅读(191)  评论(0编辑  收藏  举报