括号生成
错误思路:就是给定 n 对括号字符,求其所有排列组合中有效的组合
第一个元素跟最后一个元素肯定是()
可以用栈的思想,但是怎么操作
思路:回溯法
- 递归函数定义: 使用递归函数 generate 来生成括号,该函数可以接受当前括号字符串 current、已经使用的左括号数 open 和已经使用的右括号数 close,以及括号对数 n。
- 递归终止条件: 当 current 字符串的长度达到 2 * n 时(因为每一对括号由两个字符组成),将 current 添加到结果列表中。
- 递归逻辑:
-
- 添加左括号:只要左括号数目 open 小于 n,就可以添加一个左括号。
- 添加右括号:只要右括号数目 close 小于左括号数目 open,就可以添加一个右括号。这确保了生成的序列一定是有效的。
每当递归调用返回后,它回到了之前的状态(上一个递归层级)。此时,会尝试其他可能的括号添加,例如在尝试添加左括号后返回,会接着尝试添加右括号(如果条件允许)。 所以,这个函数可以探索所有的可能性。
func generateParenthesis(n int) []string {
var result []string
generate(&result, "", 0, 0, n)
return result
}
func generate(result *[]string, str string, left, right, n int) {
if len(str) == 2*n {
*result = append(*result, str)
return
}
if left < n {
generate(result, str+"(", left+1, right, n)
}
if right < left {
generate(result, str+")", left, right+1, n)
}
}