题目
22
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]
示例 2:
输入:n = 1
输出:[“()”]
提示:
1 <= n <= 8
题解
答案视角
class Solution {
private int n;
private List<String> ans = new ArrayList<>();
//索引List
private List<Integer> path = new ArrayList<>();
public List<String> generateParenthesis(int n) {
this.n = n;
dfs(0,0);
return ans;
}
private void dfs(int i, int balance) {
//如果索引数等于n 添加答案
//第一次答案是((())) 第二次答案是(()()) ....
if (path.size() == n) {
char[] s = new char[n * 2];
Arrays.fill(s,')');
for (int j : path) {
s[j] = '(';
}
ans.add(new String(s));
return;
}
//balance = 可以添加的右括号个数
for (int close = 0; close <= balance; close++) {
path.add(i + close);
//添加一次右括号就要跳过因此是i+close+1
dfs(i + close + 1, balance - close + 1);
path.remove(path.size() - 1);
}
}
}
选或不选
这里选意味着选(,不选意味着选)
class Solution {
private int n;
private List<String> ans = new ArrayList<>();
private char[] path;
public List<String> generateParenthesis(int n) {
this.n = n;
path = new char[n * 2];
dfs(0,0);
return ans;
}
private void dfs(int i, int open) {
//open代表左括号个数 右括号个数为i-open
if (i == n * 2) {
ans.add(new String(path));
return;
}
if (open < n) {
path[i] = '(';
dfs(i+1,open+1);
}
if (i - open < open) {
path[i] = ')';
dfs(i+1,open);
}
}
}
文章描述了一个编程问题,要求设计一个函数生成给定数量n的所有有效括号组合。使用深度优先搜索(DFS)策略,通过类Solution中的两个不同实现展示了如何通过遍历路径和控制括号数量来解决此问题。
996

被折叠的 条评论
为什么被折叠?



