数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
提示:
1 <= n <= 8
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/generate-parentheses
思路:
回溯法
java:
class Solution {
public List<String> generateParenthesis(int n) {
List<String> result = new LinkedList<>();
backtrace(n,n,n,0,new StringBuilder(),result);
return result;
}
/*
left 代表 n 个左括号还剩下多少个,right 表示 n 个右括号还剩下多少个。用于剪枝不符合预期的情况,比如当前字符串中的左括号少于右括号的情况
index 用于表示当前字符位于字符串的哪个位置,若是 index == 2 * n 说明得到了一个完整的符合要求的括号组合
*/
public void backtrace(int n,int left, int right,int index,StringBuilder stringBuilder,List<String> result){
// 若左括号剩下的多,说明不合法
if(left>right) {
return;
}
// 左括号或者右括号用光以后,就不能再用了
if(left<0 || right<0) {
return;
}
if(index==2*n) {
result.add(stringBuilder.toString());
return;
}
stringBuilder.append('(');
backtrace(n,left-1,right,index+1,stringBuilder,result);
stringBuilder.deleteCharAt(stringBuilder.length()-1);
stringBuilder.append(')');
backtrace(n,left,right-1,index+1,stringBuilder,result);
stringBuilder.deleteCharAt(stringBuilder.length()-1);
}
}