数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
func generateParenthesis(n int) []string {
var result []string
// 定义回溯函数
var backtrack func(left, right int, combination string)
backtrack = func(left, right int, combination string) {
// 如果左右括号都用完了,将组合添加到结果中
if left == n && right == n {
result = append(result, combination)
return
}
//这里不需要使用显示的回溯是因为,字符串拼接是每次生成一个新的字符串但不影响原字符串的值,所以递归调用完combination的值并不会改变。如果使用字符串修改的话,就需要使用显示回溯来进行返回原字符串的值了
// 如果左括号未用完,可以继续添加左括号
if left < n {
fmt.Println("l")
backtrack(left+1, right, combination+"(")
}
// 如果右括号未用完,并且右括号数量小于左括号数量,可以继续添加右括号
if right < left {
fmt.Println("r")
backtrack(left, right+1, combination+")")
}
}
// 开始回溯
backtrack(0, 0, "")
return result
}