题号:no49
题目名:括号(全排列)
原题URL:https://leetcode-cn.com/problems/bracket-lcci/
题目描述
括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。
说明:解集不能包含重复的子集。
示例
示例 1:
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路
1.回溯剪枝算法
2.将路径,判断条件和相等条件传入
3.进行dfs,剪枝
解题代码
public class Solution {
List<String> res = new ArrayList<>();
public List<String> generateParenthesis(int n) {
if(n==0) return res;
StringBuilder sb = new StringBuilder();
//dfs,传入路径,条件就是剩余的左括号数
dfs(sb,n,n,2*n);
return res;
}
private void dfs(StringBuilder sb,int left,int right,int len) {
if(sb.length()==len) {
res.add(sb.toString());
return;
}
//如果有左括号,就可以加左括号
if(left>0) {
sb.append('(');
dfs(sb,left-1,right,len);
sb.deleteCharAt(sb.length()-1);
}
//如果有右括号,且数量小于左括号才能加入右括号
if(right>0&&left<right) {
sb.append(')');
dfs(sb,left,right-1,len);
sb.deleteCharAt(sb.length()-1);
}
}
}