LeetCode 22. 括号生成

题目描述

🔥 22. 括号生成

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

示例:

1
2
3
4
5
6
7
8
9
输入: n = 3
输出:
[
 "((()))",
 "(()())",
 "(())()",
 "()(())",
 "()()()"
]

思路分析

生成有效的括号组合可以使用回溯法。我们需要在生成过程中保持括号的平衡,即在任何时候,左括号的数量都应该大于或等于右括号的数量。

具体步骤如下:

  1. 使用递归函数来生成括号组合。
  2. 在递归过程中,维护两个计数器:left 表示已经使用的左括号数量,right 表示已经使用的右括号数量。
  3. 如果 left 小于 n,可以添加一个左括号。
  4. 如果 right 小于 left,可以添加一个右括号。
  5. leftright 都等于 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),存储所有有效的括号组合的复杂度。

🍏 点击查看 Java 题解

1
write your code here
本文作者:
本文链接: https://hgnulb.github.io/blog/2022/55185444
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!