文章目录
- 22. 括号生成
- 解题思路
- Go代码
22. 括号生成
22. 括号生成
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合
。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
提示:
- 1 <= n <= 8
解题思路
对于括号相关问题,有一条定论:已经出现的左括号一定比有括号多才可能是合法的括号
这题是经典的回溯题,总共就只能使用"("
和")"
,如果想要最终的括号是有效的,那么当前节点剩余的")"
一定要比"("
多
假设左右括号各两个,则回溯图如下
""
1/ \
( ) //这里直接用了),不用往后走了,往后走最终也不可能是有效括号
2/ \6
(( ()
/ \3 ....
(()
4/ \5
(())
2继续往左递归发现左括号小于0了,回溯到2,继续往右递归选右括号,进去后4选左,
发现左括号小于0,回溯到3,往右到5,此时左右括号用完,是一个正确结果,添加到
结果后返回,一路回溯到6位置,后续递和归类似,不赘述了。
Go代码
func generateParenthesis(n int) []string {
res := make([]string,0)
backtrack(n,n,"",&res)
return res
}
func backtrack(left,right int,cur string,res *[]string) {
// 左边括号使用的比右边括号少,肯定不能是有效括号了,返回(属于剪枝)
// 或者左括号或者右括号用完,也可以返回了
if left > right || left < 0 || right < 0 {
return
}
// 左右括号刚好用完,是一个正确结果
if left == 0 && right == 0 {
*res = append(*res,cur)
return
}
backtrack(left - 1,right,cur + "(",res)
backtrack(left,right - 1,cur + ")",res)
}