LeetCode 22. 括号生成
题目描述
🔥 22. 括号生成
给出
n
代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。示例:
1 2 3 4 5 6 7 8 9 输入: n = 3 输出: [ "((()))", "(()())", "(())()", "()(())", "()()()" ]
思路分析
生成有效的括号组合可以使用回溯法。我们需要在生成过程中保持括号的平衡,即在任何时候,左括号的数量都应该大于或等于右括号的数量。
具体步骤如下:
- 使用递归函数来生成括号组合。
- 在递归过程中,维护两个计数器:
left
表示已经使用的左括号数量,right
表示已经使用的右括号数量。- 如果
left
小于n
,可以添加一个左括号。- 如果
right
小于left
,可以添加一个右括号。- 当
left
和right
都等于n
时,表示生成了一个有效的括号组合,将其加入结果集。
参考代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func generateParenthesis(n int) []string {
var res []string
var backtrack func(cur string, left, right int)
backtrack = func(cur string, left, right int) {
// 如果当前字符串长度等于 2*n,表示生成了一个有效的括号组合
if len(cur) == 2*n {
res = append(res, cur)
return
}
// 如果左括号数量小于 n,可以添加左括号
if left < n {
backtrack(cur+"(", left+1, right)
}
// 如果右括号数量小于左括号数量,可以添加右括号
if right < left {
backtrack(cur+")", left, right+1)
}
}
backtrack("", 0, 0)
return res
}
- 时间复杂度:O (4^n / √n),生成所有有效的括号组合的复杂度。
- 空间复杂度:O (4^n / √n),存储所有有效的括号组合的复杂度。
1
write your code here
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
本博客所有文章除特别声明外,均采用