LeetCode22:括号生成
22. 括号生成 - 力扣(LeetCode)
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
思路:
-
最直接的思路,构建一个长度为2n的数组,针对每个位置枚举两种情况,最后校验生成的字符串是否合格(显然这个指数级别的时间复杂度不满足条件)
-
仔细思考左括号和右括号的限制条件(在第一个思路上进行减枝),对于当前持有left个左括号和right个右括号的数组来说,需要满足
- 左括号数量必须小于n
- 右括号数量必须小于左括号
基于此我们可以得到加括号的限制条件:
- 如果左括号的数量小于n,仍可以继续插入左括号
- 如果右括号的数量小于左括号,仍可以插入右括号
递归出口为右括号已经全部插入
代码实现如下:
{fold}1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList<>();
dfs(0, 0, new StringBuilder(), ans, n);
return ans;
}
private void dfs(int left, int right, StringBuilder path, List<String> ans, int n) {
if (right == n) {
ans.add(path.toString());
return;
}
if(left < n) {
path.append('(');
dfs(left+1, right, path, ans, n);
path.deleteCharAt(path.length()-1);
}
if(right < left) {
path.append(')');
dfs(left, right+1,path, ans, n);
path.deleteCharAt(path.length()-1);
}
}
}
|