给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
回溯法在生成全集的过程中进行剪枝,使得效率最大。并且不需要判重,因为回溯就是一次性生成全集,所以不会重复。剪枝需要用到两个变量,一个是当前过程中左括号数量l和当前过程中右括号数量r,若r>l则一定无解,则剪去这个部分。
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList<>();
backtrack(ans, "", 0,0,n);
return ans;
}
public void backtrack(List<String> ans, String cur, int open, int close, int max){
if(cur.length() == max * 2){
ans.add(cur);
return;
}
if(open < max){
backtrack(ans, cur+"(", open + 1, close, max);
}
if(close < open){
backtrack(ans, cur +")", open, close+1, max);
}
}
}