阅读目录
括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。
示例 1
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
package main
import "fmt"
// generateParenthesis 生成所有有效的括号组合
func generateParenthesis(n int) []string {
result := []string{
} // 存储所有生成的括号组合的结果数组
backtrack(&result, "", 0, 0, n) // 回溯算法生成所有括号组合
return result
}
// backtrack 回溯算法生成所有括号组合
func backtrack(result *[]string, current string, open, close, max int) {
// 如果当前生成的括号组合长度等于需要生成的括号对数的两倍
if len(current) == max*2 {
*result = append(*result, current) // 将这个组合加入到结果数组中
return // 结束递归
}
// 如果当前已经生成的左括号数量小于需要生成的括号对数
if open < max {
backtrack(result, current+"(", open+1, close, max) // 在当前组合中添加一个左括号
}
// 如果当前已经生成的右括号数量小于当前已经生成的左括号数量
if close < open {
backtrack(result, current+")", open, close+1, max) // 在当前组合中添加一个右括号
}
}
func main() {
n := 3
combinations := generateParenthesis(n) // 生成所有括号组合
fmt.Println(combinations) // 打印所有括号组合
}
root@debiancc:~/www/test# go run test.go
[((())) (()()) (())() ()(()) ()()()]
root@debiancc:~/www/test# go run test.go
[()]
root@debiancc:~/www/test#
在这段代码中,我们定义了一个函数 generateParenthesis
,用于生成所有有效的括号组合。
这个函数通过调用 backtrack
函数实现回溯算法来生成括号组合。
backtrack 函数的参数说明如下:
- result:结果数组,用于存储生成的所有括号组合。
- current:当前正在生成的括号组合。
- open:当前已经生成的左括号的数量。
- close:当前已经生成的右括号的数量。
- max:需要生成的括号对数。
backtrack 函数的核心思路是递归生成所有可能的括号组合,并在生成过程中判断组合是否合法。
具体来说,我们首先判断当前正在生成的括号组合是否已经达到了需要生成的括号对数(即长度是否等于 max*2)。
如果是,则将这个组合加入到结果数组中。
否则,我们可以考虑在当前组合中添加一个左括号或者右括号,但是添加的括号必须满足以下两个条件:
- 如果添加一个左括号,那么当前已经生成的左括号数量必须小于需要生成的括号对数。
- 如果添加一个右括号,那么当前已经生成的右括号数量必须小于当前已经生成的左括号数量。
最后,我们在主函数中调用 generateParenthesis 函数,并将生成的括号组合打印出来。