题目描述
给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。
例如,给出n=3,解集为:
"((()))", "(()())", "(())()", "()(())", "()()()"
解析:关键点在于当前左括号的数量l 大于等于 右括号的数量r
<1>当前左括号的数量l < 总的括号对数:可添加左括号
<2>当前右括号的数量r < 当前左括号的数量l :可添加右括号
<3> 退出的条件:当前右括号的数量r = 总的括号对数,即所有的括号添加完毕
ArrayList<String> result = new ArrayList<String>();
public ArrayList<String> generateParenthesis (int n) {
//用递归解决.初始已添加的左右括号数均为0
find(0,0,"",n);
return result;
}
/*
**l:表示当前已添加左括号的数量
**r:表示当前已添加右括号的数量
**s:表示当前已添加的括号字符串
**n:表示括号的总个数
*/
public void find(int l,int r,String s,int n){
if(r==n)//右括号已经全部添加完毕,此时得到的括号字符串合法
result.add(s);
if(l<n){//左括号没有添加完毕,添加一个‘(’,继续添加
find(l+1,r,s+'(',n);
}
if(r<l){//右括号没有添加完毕,添加一个‘)’,继续添加(前提是左括号的数量>右括号)
find(l,r+1,s+')',n);
}
}