class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new LinkedList<>();
backtrack(ans, n, 0, "");
return ans;
}
// 回溯: left表示可以使用的左括号数,right表示可以使用的右括号数
private void backtrack(List<String> ans, int left, int right, String track) {
if (left == 0 && right == 0) ans.add(track);
else {
// 使用一个左括号,同时使右括号数+1,避免生成无效括号
if (left > 0) backtrack(ans, left - 1, right + 1, track + '(');
// 可以使用的右括号数大于0,用来补齐原来的左括号
if (right > 0) backtrack(ans, left, right - 1, track + ')');
}
}
}