22. 括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]
示例 2:输入:n = 1
输出:[“()”]提示:
1 <= n <= 8
暴力
var result []string
func dfs(cur string, n int) {
if len(cur) == 2*n {
if valid(cur) {
result = append(result, cur)
}
return
}
cur = cur + "("
dfs(cur, n)
cur = cur[:len(cur)-1]
cur = cur + ")"
dfs(cur, n)
}
func valid(str string) bool {
balance := 0
for i := 0; i < len(str); i++ {
if str[i] == '(' {
balance++
} else {
balance--
}
if balance < 0 {
return false
}
}
return balance == 0
}
func generateParenthesis(n int) []string {
result = make([]string,0)
cur := ""
dfs(cur, n)
return result
}
回溯+剪枝
var ans []string
func generateParenthesis(n int) []string {
ans = make([]string, 0)
helper("", n, n)
return ans
}
func helper(str string, left, right int) {
if left == 0 && right == 0 {
ans = append(ans, str)
return
}
if left == right {
//剩余左右括号数相等,下一个只能用左括号
helper(str+"(", left-1, right)
} else if left < right {
//剩余左括号小于右括号,下一个可以用左括号也可以用右括号
if left > 0 {
helper(str+"(", left-1, right)
}
helper(str+")", left, right-1)
}
}