数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
**输入:** n = 3
**输出:** ["((()))","(()())","(())()","()(())","()()()"]
示例 2:
**输入:** n = 1
**输出:** ["()"]
提示:
1 <= n <= 8
思路:当左右括号全部用完时结束递归
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans=new ArrayList<>();
backtrace(ans,n,n,"");
return ans;
}
//注意结束逻辑,需要把所有情况统计到
public void backtrace(List<String> ans,int left,int right,String str){
//如果右括号用的多,则直接返回
if(left>right||left<0)
return;
if(left==0&&right==0){
ans.add(str);
return;
}
//str起始为空,先添加左括号,再添加右括号
backtrace(ans,left-1,right,str+"(");
backtrace(ans,left,right-1,str+")");
}
}
思路二
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList<String>();
backtrack(ans, new StringBuilder(), 0, 0, n);
return ans;
}
public void backtrack(List<String> ans, StringBuilder cur, int open, int close, int max) {
if (cur.length() == max * 2) {
ans.add(cur.toString());
return;
}
if (open < max) {
cur.append('(');
backtrack(ans, cur, open + 1, close, max);
//注意保持本层组成的字符串不变
cur.deleteCharAt(cur.length() - 1);
}
//只有当左括号数量小于右括号数量时,添加右括号
if (close < open) {
cur.append(')');
backtrack(ans, cur, open, close + 1, max);
cur.deleteCharAt(cur.length() - 1);
}
}
}