lichao_normal

导航

Generate Parentheses

问题是给定n对的圆括号,产生所有正确顺序的或括号排列序列。

首先明确第一个出现的一定是左括号,而以后的则是可以出现左也可以出现右。

则n=1时:

当n=2时:

当n=3时:

由此可见,很明显的树形结构,所有的排列顺序,就是对树进行的一次dfs,所以借用dfs的算法就可以完成。

void generate(int left,int right,char* str,char** res,int n,int index ,int* returnSize){
    //如果left=right=0,表明已经没剩余的括号用来分配,这样也就递归到最低层
    //这样我们就将这样的字符串添加到结果集中
    if(left==0&&right==0){
        str[2*n]='\0';
        res[*returnSize]=(char*)malloc(sizeof(char)*(2*n+1));
        strcpy(res[*returnSize],str);
        (*returnSize)++;
        return ;
    } 
    //第一出现的括号一定是左括号,并且左括号一定先于右括号出现
    //并且左括号出现于右括号无关 
    if(left>0){
        str[index]='(';
        generate(left-1,right,str,res,n,index+1,returnSize);
    }
    //右括号出现时一定要满足已经出现过左括号,并且剩余的左括号数目小于剩余的右括号数目
    
    if(right>0&&left<right){
        str[index]=')';
        
        generate(left,right-1,str,res,n,index+1,returnSize);
    } 
}
char** generateParenthesis(int n, int* returnSize) {
    char** res;
    res=(char**)malloc(sizeof(char*)*100000);
    char* str;
    str=(char*)malloc(sizeof(char)*(2*n+1));
    generate(n,n,str,res,n,0,returnSize);
     return res;   
}
View Code

 

 

 
 

 

posted on 2016-11-25 17:13  lichao_normal  阅读(95)  评论(0)    收藏  举报