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; }
posted on 2016-11-25 17:13 lichao_normal 阅读(95) 评论(0) 收藏 举报
浙公网安备 33010602011771号