数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]
示例 2:
输入:n = 1
输出:[“()”]
提示:1 <= n <= 8
思路:直接用暴力做法,对括号进行全排列,然后剪纸判断,时间复杂度会超
class Solution:
def isValid(self, s):
left, right = 0, 0
for i in range(len(s)):
if s[i] == '(':
left += 1
elif s[i] == ')':
right += 1
if right > left:
return False
if left == right:
return True
return False
def perm(self, a, res, level):
if level == len(a):
tmp = ''.join(a)
if tmp not in res:
res.add(tmp)
return
for i in range(level, len(a)):
a[i], a[level] = a[level], a[i]
if self.isValid(a):
self.perm(a, res, level+1)
a[i], a[level] = a[level], a[i]
def generateParenthesis(self, n: int) -> List[str]:
res = []
a = []
for i in range(n):
a.append('(')
a.append(')')
b = set()
self.perm(a, b, 0)
for x in b:
res.append(x)
return res
另一种思路是采用递归/回溯法,e.g. n=1 时,显然是返回 [‘()’], n=2 是 其实就是在 ’()‘ 长度为 2 的中间或两边的每个位置插入 ‘()’,去重后,显然结果就是 [‘()()’, ‘(())’], 代码就实现如下:
def generateParenthesis(self, n: int) -> List[str]:
res = []
a = set()
if n == 1:
return ['()']
for x in self.generateParenthesis(n-1):
for j in range(len(x)+1):
temp = x[:j] + '()'+x[j:]
if temp not in a:
a.add(temp)
res.append(temp)
return res