
/**
合法括号生成规则:
第一个括号必须是左括号(第一个为右必定无法闭合)
选择过程中左括号数量必须小于n才可选择左括号(大于n则一定有括号无法闭合)
左括号数量必须大于右括号数量才可选择右括号(相等代表所有前驱括号都已闭合)
所需参数:
left 记录已选择左括号数
right 记录已选择右括号数
限制条件:
由于括号必定从左括号开始的特性,左括号优先级高于右括号
left < n --> 避免左括号超量,导致无足够右括号与之闭合
left > right --> 括号未全部闭合,可选择右括号与之闭合
两条件共同保证括号生成合法性
*/
java
class Solution {
//保存结果集
private List<String> res = new ArrayList<>();
//保存单次结果
private StringBuilder tempResult = new StringBuilder();
private int n;
public List<String> generateParenthesis(int n) {
/**
合法括号生成规则:
第一个括号必须是左括号(第一个为右必定无法闭合)
选择过程中左括号数量必须小于n才可选择左括号(大于n则一定有括号无法闭合)
左括号数量必须大于右括号数量才可选择右括号(相等代表所有前驱括号都已闭合)
所需参数:
left 记录已选择左括号数
right 记录已选择右括号数
限制条件:
由于括号必定从左括号开始的特性,左括号优先级高于右括号
left < n --> 避免左括号超量,导致无足够右括号与之闭合
left > right --> 括号未全部闭合,可选择右括号与之闭合
两条件共同保证括号生成合法性
*/
this.n = n;
backtrack(0,0);
return res;
}
private void backtrack(int left, int right) {
//生成完毕,保存结果
if(left + right == 2*n) {
res.add(tempResult.toString());
return;
}
//左括号未到上限可选择左括号
if(left < n) {
tempResult.append("(");
left++;
backtrack(left,right);
//回溯
left--;
tempResult.deleteCharAt(tempResult.length() - 1);
}
//左括号未全部与右括号匹配,可选择右括号
if(left > right) {
tempResult.append(")");
right++;
backtrack(left,right);
//回溯
right--;
tempResult.deleteCharAt(tempResult.length() - 1);
}
}
}