题目
截图自官方
代码
class Solution {
// 思路:用递归,当左括号数目小于n时,我们就可以添加左括号。当右括号数目小于当前左括号数目时,我们就可以添加一个右括号。当当前字符串的长度为2n时,一次寻找结束,开始回溯。
// 回溯时,注意因为StringBuilder cur是公用的,我们必须在调用deleteCharAt将刚刚添加的字符删掉。
ArrayList<String> ans=new ArrayList();
public List<String> generateParenthesis(int n) {
backtrack(new StringBuilder(),0,0,n);
return ans;
}
public void backtrack(StringBuilder cur,int open,int close,int n){
// 注意不要写成2n
if(cur.length()==2*n){
ans.add(cur.toString());
return;
}
// 注意下面两个判断不是if else的关系
if(open<n){
cur.append('(');
backtrack(cur,open+1,close,n);
// 本方法一定要加,容易疏忽想不到
cur.deleteCharAt(cur.length()-1);
}
if(close<open){
cur.append(')');
backtrack(cur,open,close+1,n);
cur.deleteCharAt(cur.length()-1);
}
}
}