📅  最后修改于: 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)
这个函数带有五个参数:
函数首先判断左右括号数量是否已经达到了n,若是,则说明这个组合是合法的,将其添加到结果集里即可。若不是,则可以尝试添加左括号或右括号,但添加左括号的前提是当前左括号的数量小于n,添加右括号的前提是右括号数量要小于左括号。
接下来,我们就可以编写主函数:
def generateParenthesis(n):
res = []
generateParenthesisHelper(n, 0, 0, "", res)
return res
主函数很简单,用res来存储结果集,然后调用helper递归回溯,最终返回结果即可。
我们可以使用题目描述中的样例进行测试:
assert generateParenthesis(3) == ["((()))", "(()())", "(())()", "()(())", "()()()"]