题目:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
解题思路:
该题我们可以用回溯法来做。
我们可以先用排列组合,列出所有可能的结果。例如加入n=2,则会有以下结果
由上图我们可以得出结论:如果n=2,则left代表左括号的数量;right则代表右括号的数量。
(1) 当left<right时,不符合条件。
(2) 当left≥left时,符合条件。
(3) 当left=right=n时,符合条件。
解题代码:
class Solution {
public List<String> generateParenthesis(int n) {
List<String> res=new ArrayList<>();
backtracking(n,res,0,0,"");
return res;
}
private void backtracking(int n,List<String> res,int left,int right,String str){
//不符合,回溯
if(right>left){
return;
}
//符合条件,加入结果集
if(left==n&&right==n){
res.add(str);
return;
}
//加左括号
if(left<n){
backtracking(n,res,left+1,right,str+"(");
}
//加右括号
if(right<left){
backtracking(n,res,left,right+1,str+")");
}
}
}