题目地址: leetcode.com/problems/ge…
生成所有2n长度的合法的括号序列。
直接DFS,枚举的顺序是,先枚举左括号,再枚举右括号。需要注意何时可以枚举左括号,何时可以枚举右括号。为了提高效率,在深搜的时候,我们直接将当前已经获得的括号序列中左右括号的个数当成参数传递给下一层(否则的话不利于剪枝。因为如果到某一层枚举的时候,如果左括号个数小于右括号个数,或者左括号个数大于了n nn,就已经得到了一个非法的括号序列了,要及时剪枝。如果将左右括号个数传递下去,就不用数已经获得的序列里有多少左右括号了)。代码如下:
import java.util.ArrayList;
import java.util.List;
public class Solution {
public List<String> generateParenthesis(int n) {
List<String> res = new ArrayList<>();
dfs(n, 0, 0, new StringBuilder(), res);
return res;
}
// sb是当前已经获得的一个合法的括号序列
private void dfs(int n, int left, int right, StringBuilder sb, List<String> res) {
// 如果已经枚举完2n个括号了,说明已经得到了一个合法的解,将其加入res
if (l + r == 2 * n) {
res.add(sb.toString());
return;
}
// 如果左括号个数小于n,我们可以在当前序列中枚举左括号
if (l < n) {
dfs(n, l + 1, r, sb.append('('), res);
// 恢复现场
sb.setLength(sb.length() - 1);
}
// 如果右括号个数小于左括号个数,我们可以在当前序列中枚举右括号
if (r < l) {
dfs(n, l, r + 1, sb.append(')'), res);
// 恢复现场
sb.setLength(sb.length() - 1);
}
}
}
原文链接:(10条消息) 【Leetcode】22. Generate Parentheses_edWard的博客-CSDN博客