22.括号生成

68 阅读1分钟

题目描述

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

 

示例 1:

输入: n = 3
输出: ["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入: n = 1
输出: ["()"]

 

提示:

  • 1 <= n <= 8

思路

使用递归进行处理(dfs),遍历所有可能性;

明确:有效括号一定是 (( .. )) 的形式,因此左括号肯定是优先放置的,考虑到每一个左括号都必须对应一个右括号,所以右括号的放置原则就是剩余的右括号数量一定是大于左括号数量的。

  1. 左括号优先
  2. 剩余的右括号数量严格大于左括号时才放置右括号(保证每一个左括号都能被括住)

代码

func generateParenthesis(n int) []string {
    var ans []string
    var tmp []byte
    
    var helper func(lr, rr int) 
    helper = func(lr, rr int) {
        if len(tmp) == 2 * n {
            ans = append(ans, string(tmp))
            return
        }
        if lr > 0 {
            tmp = append(tmp, '(')
            helper(lr-1, rr)
            tmp = tmp[:len(tmp)-1]
        }
        if rr > 0 && rr > lr {
            tmp = append(tmp, ')')
            helper(lr, rr-1)
            tmp = tmp[:len(tmp)-1]
        }
    }
    
    helper(n, n)
    return ans
}

图示

image.png