【leet-code清晰解题思路💯✅】22. 括号生成

75 阅读1分钟

题目描述

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 8

解题思路

  • 合法的括号:对其任意前缀,左括号数>=右括号数
  • 根据这个规则,我们可以dfs按位拼接字符串,直到长度2*n。合法的序列加入答案即可。复杂度O(2^2n)
func generateParenthesis(n int) []string {
   ans := make([]string, 0)
   s := make([]byte, n*2)
   ans = getGenerateParenthesis(0, 0, n*2, s, ans)
   return ans
}

func getGenerateParenthesis(l, r, n int, s []byte, ans []string) []string {
   if l+r == n {
      ans = append(ans, string(s))
      return ans
   }
   if l < n/2 {
      s[l+r] = '('
      ans = getGenerateParenthesis(l+1, r, n, s, ans)
   }
   if r < l && r < n/2 {
      s[l+r] = ')'
      ans = getGenerateParenthesis(l, r+1, n, s, ans)
   }
   return ans
}

image.png