题目描述:
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
解题思路1:
题目可以抽象为用"("
或 ")"
填满2n个空间,并且需要判断左括号和右括号的个数是否相等。
为了检查序列是否有效,我们遍历这个序列,并使用一个变量 num 表示左括号的数量减去右括号的数量。如果在遍历过程中 num 的值小于零,或者结束时 num 的值不为零,那么该序列就是无效的,否则它是有效的。
代码1:
class Solution(object):
def generateParenthesis(self, n):
def generate(A):
if len(A) == 2*n:
if valid(A):
ans.append("".join(A))
else:
A.append('(')
generate(A)
A.pop()
A.append(')')
generate(A)
A.pop()
def valid(A):
num = 0
for c in A:
if c == "(": num += 1
else: num -= 1
if num < 0: return False # 当出现类似['(',')',')'...]的情况时,提前终止
return num == 0 # 判断num的值是否为0来返回True或者False
ans = []
generate([])
return ans
s = Solution()
n = 3
print(s.generateParenthesis(n))
解题思路2:
任何一个括号序列都一定是由 (
开头,并且第一个 (
一定有一个唯一与之对应的 )
。这样一来,每一个括号序列可以用 (a)b
来表示,其中 a 与 b 分别是一个合法的括号序列(可以为空)。
那么,要生成所有长度为 2 * n
的括号序列,我们定义一个函数 generate(n)
来返回所有可能的括号序列。
代码2:
from functools import lru_cache
class Solution:
@lru_cache(None)
def generateParenthesis(self, n):
if n == 0:
return ['']
ans = []
for c in range(n):
for left in self.generateParenthesis(c):
for right in self.generateParenthesis(n-1-c):
ans.append('({}){}'.format(left, right))
return ans
s = Solution()
n = 3
print(s.generateParenthesis(n))
题解来源:
题目来源: