虽然有想到用递归的方法做,但最后还是写不出来。看了leetcode上的讨论,总结写思路:
1. 用两个变量来记录剩下的左括号和右括号的个数。每次生成一个左括号或右括号,相应的变量减一。
2. 但是只有当剩下的左括号数小于剩下的右括号数时,才可以生成右括号。否则是不合法的。
3. 当剩下的 左括号和右括号的个数都为0时,说明括号已经全部生成完成。把生成的字符串添加到list中,方法返回。
代码如下:
public List<String> generateParenthesis(int n) {
List<String> list = new ArrayList<String>();
backtrack(list,"",n,n);
return list;
}
public void backtrack(List<String> list,String str,int open,int close){
if(open ==0 && close==0){
list.add(str);
return;
}
if(open>0) backtrack(list,str+"(",open-1,close);
if(close>0 && open<close) backtrack(list,str+")",open,close-1);
}