题目描述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入: n = 3
输出: ["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入: n = 1
输出: ["()"]
提示:
1 <= n <= 8
代码及注释
go
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
}
代码解释:
-
初始化结果数组
gores := make([]string, 0)使用
make函数初始化一个空的字符串数组res,用于存储生成的括号组合。 -
定义DFS函数
govar dfs func(left, right int, path string)定义一个DFS函数
dfs,该函数将用于生成所有有效的括号组合。 -
DFS函数的实现
godfs = 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函数,并初始化左右括号的数量
godfs(n, n, "")调用DFS函数,同时初始化左右括号的数量为
n。 -
返回结果数组
goreturn res返回生成的所有有效的括号组合。
通过这样的DFS递归实现,可以在 O(2^n) 的时间复杂度内生成所有有效的括号组合。