刷题使我快乐,满脸开心.jpg

  • 来源:力扣(LeetCode)
  • 链接:https://leetcode.cn/problems/generate-parentheses/
  • 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 8

思路

我的思路第一反应就是回溯遍历。
尝试去放入左括号或者右括号,当然,会有一些限制,

  • 比如左、右括号至多n个
  • 右括号不能在左括号之前

而回溯的思路就是:

  • 放一个之后,往下层尝试
  • 然后跳回来恢复现场,换成放入另一个,再往下层尝试

好像也没什么可说的了,直接上代码。

代码

func generateParenthesis(n int) []string {
    res := make([]string, 0)
    temp := make([]byte, n*2)
    var generate func(int, int)
    generate = func(totalNum, leftNum int) {
        // 总共2n个字符就凑够了
        if totalNum == n*2 {
            res = append(res, string(temp))
            return
        }
        // 总共一共n个左括号,多了不能再放
        if leftNum < n {
            temp[totalNum] = '('
            generate(totalNum+1, leftNum+1)
        }
        // 右括号不能在左括号之前,也就是已经放入的左括号得多于右括号才能放右括号
        if totalNum-leftNum < leftNum {
            temp[totalNum] = ')'
            generate(totalNum+1, leftNum)
        }
    }
    generate(0, 0)
    return res
}