📜  门| GATE-CS-2005 |第 46 题(1)

📅  最后修改于: 2023-12-03 14:58:26.434000             🧑  作者: Mango

题目描述

给定一个正整数n,编写一个函数以生成所有长度为n的有效括号组合。例如,给定n = 3,解集为:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

解题思路

这是一道经典的回溯问题。我们从左括号开始,每当左括号数量少于n时,可以添加一个左括号,当右括号数量小于左括号时,可以添加一个右括号。当左右括号数量都达到n的时候,这个组合就是一个合法的解。

代码实现

我们先定义一个helper函数来辅助完成递归回溯操作:

def generateParenthesisHelper(n, left, right, path, res):
    if left == n and right == n:
        res.append(path)
        return

    if left < n:
        generateParenthesisHelper(n, left+1, right, path+"(", res)
    if right < left:
        generateParenthesisHelper(n, left, right+1, path+")", res)

这个函数带有五个参数:

  1. n: 字符串长度,也就是括号数的一半。
  2. left: 左括号数量。
  3. right: 右括号数量。
  4. path: 当前组合。
  5. res: 结果集合。

函数首先判断左右括号数量是否已经达到了n,若是,则说明这个组合是合法的,将其添加到结果集里即可。若不是,则可以尝试添加左括号或右括号,但添加左括号的前提是当前左括号的数量小于n,添加右括号的前提是右括号数量要小于左括号。

接下来,我们就可以编写主函数:

def generateParenthesis(n):
    res = []
    generateParenthesisHelper(n, 0, 0, "", res)
    return res

主函数很简单,用res来存储结果集,然后调用helper递归回溯,最终返回结果即可。

测试样例

我们可以使用题目描述中的样例进行测试:

assert generateParenthesis(3) == ["((()))", "(()())", "(())()", "()(())", "()()()"]