class Solution {
// 回溯,全排列
// stringBuffer的append方法和deleteCharAt()方法
// 有效的括号组合,对于任意括号左边的左括号的数量大于等于右括号的数量
// 空间复杂度:O(n)
List<String> res;
int left, right;
int count = 0;
StringBuffer sb = new StringBuffer();
public List<String> generateParenthesis(int n) {
left = 0;
right = 0;
count = n;
res = new ArrayList<>();
backTracking();
return res;
}
public void backTracking() {
if (right == count) {
res.add(sb.toString());
}
if (left < count) { // append左括号
sb.append('(');
left++;
backTracking();
sb.deleteCharAt(sb.length() - 1);
left--;
}
if (right < left) { // append右括号,右括号的数量需要小于左括号的数量
sb.append(')');
right++;
backTracking();
sb.deleteCharAt(sb.length() - 1);
right--;
}
}
}