题目:给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
示例 n = 3, 结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
题目有点难。理顺一下思路,终于实现,并通过。
思路: 递归
难点:a.怎么生成 括号组合字符串,
用递归迭代生成字符串,每次分两次递归调用,一次是选择左括号,一次选择右括号。下面是完整代码。
def generate(s,l1,l2,l):
if l1.__len__() == 0 and l2.__len__() == 0: #递归结束
l.append(s)
else:
s1 = s
l11 = l1.copy() #python3才有copy 方法, 因为list是引用对象,必须复制一份,分开递归调用
l22 = l2.copy()
if l1.__len__() != 0 and l1.__len__() <= l22.__len__(): #选择左括号
s1 += l1.pop(0)
generate(s1,l1,l22,l)
if l2.__len__() != 0 and l1.__len__() <= l22.__len__(): #选择右括号
s += l2.pop(0)
generate(s,l11,l2,l)
b,对有效括号的组合
在字符串想加的要满足左括号数大于等于右括号数,才是有效的括号组合,如上代码中,剩下的括号字符长度比较。l1.__len__() <= l22.__len__(),说明l1中剩下的左括号数少,字符串中选择的左括号数多。
其他思路:
1,按照规律,第一个字符是左括号,
这个比较难吧,没有想出来,不知道有没有规律可循
2.生成所有组合,在挑选出来符合有效括号的组合。
这个复杂度很大, 生成所有组合 n^2,在扫描 每个字符串是否是有效的括号组合 需要遍历n^2 次,每次判断2*n长度字符串是否是有效的括号组合。
最后:贴出官方的代码, 比我自己写的,简洁的太多,空间复杂度也低。我的那个容易想出来吧!这也是安慰安慰。
def generateParenthesis(self, N):
ans = []
def backtrack(S = '', left = 0, right = 0):
if len(S) == 2 * N:
ans.append(S)
return
if left < N:
backtrack(S+'(', left+1, right)
if right < left:
backtrack(S+')', left, right+1)
backtrack()
return ans
更多其他的思路:参考