题目描述
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入: n = 3
输出: [“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]
示例 2:
输入: n = 1
输出: [“()”]
提示:
1 <= n <= 8
代码及注释
func generateParenthesis(n int) []string {// 初始化结果数组res := make([]string, 0)// 定义DFS函数var dfs func(left, right int, path string)dfs = func(left, right int, path string) {// 如果左右括号都已使用完毕,则将路径添加到结果数组中if left == 0 && right == 0 {res = append(res, path)return }// 如果左括号还有剩余,则可以添加左括号if left > 0 {dfs(left - 1, right, path + "(")}// 如果右括号的数量大于左括号,则可以添加右括号if right > left {dfs(left, right - 1, path + ")")}}// 调用DFS函数,并初始化左右括号的数量dfs(n, n, "")// 返回结果数组return res
}
代码解释:
-
初始化结果数组
res := make([]string, 0)
使用
make
函数初始化一个空的字符串数组res
,用于存储生成的括号组合。 -
定义DFS函数
var dfs func(left, right int, path string)
定义一个DFS函数
dfs
,该函数将用于生成所有有效的括号组合。 -
DFS函数的实现
dfs = func(left, right int, path string) {// 如果左右括号都已使用完毕,则将路径添加到结果数组中if left == 0 && right == 0 {res = append(res, path)return }// 如果左括号还有剩余,则可以添加左括号if left > 0 {dfs(left - 1, right, path + "(")}// 如果右括号的数量大于左括号,则可以添加右括号if right > left {dfs(left, right - 1, path + ")")} }
- 终止条件:如果左右括号都已使用完毕(即
left == 0 && right == 0
),则将当前路径path
添加到结果数组res
中。 - 添加左括号:如果左括号
left
的数量还有剩余(即left > 0
),则可以在当前路径path
的末尾添加一个左括号,并继续递归。 - 添加右括号:如果右括号
right
的数量大于左括号left
的数量(即right > left
),则可以在当前路径path
的末尾添加一个右括号,并继续递归。
- 终止条件:如果左右括号都已使用完毕(即
-
调用DFS函数,并初始化左右括号的数量
dfs(n, n, "")
调用DFS函数,同时初始化左右括号的数量为
n
。 -
返回结果数组
return res
返回生成的所有有效的括号组合。
通过这样的DFS递归实现,可以在 O(2^n)
的时间复杂度内生成所有有效的括号组合。