回溯----5.括号生成
题目链接
/**
合法括号生成规则:
第一个括号必须是左括号(第一个为右必定无法闭合)
选择过程中左括号数量必须小于n才可选择左括号(大于n则一定有括号无法闭合)
左括号数量必须大于右括号数量才可选择右括号(相等代表所有前驱括号都已闭合)
所需参数:
left 记录已选择左括号数
right 记录已选择右括号数
限制条件:
由于括号必定从左括号开始的特性,左括号优先级高于右括号
left < n --> 避免左括号超量,导致无足够右括号与之闭合
left > right --> 括号未全部闭合,可选择右括号与之闭合
两条件共同保证括号生成合法性
*/
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);}}
}