题目
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]
示例 2:
输入:n = 1
输出:[“()”]
提示:
1 <= n <= 8
思路和代码
在leetcode找到这题真的很难受啊,因为是我58同城面试题原题,我曾经刷到过这题,但是没写出来。今天我在上次面试后刷一遍的基础上又刷一遍,还是不会啊。啊,我怎么这么笨啊!我这么笨还不努力刷题,回来到公司上班不裁我裁谁啊。
再次刷这道题,印象中有生成新的一种括号的关键代码:
new = "(" + k1 + ")" + k2
隐约中还记得有四层for循环,有k1和k2。初始的时候列表res有两个列表元素,[None]和[“()”]。
靠着这些记忆而不是理解开始写代码,问题来了。外面两层for循环的起始位置和终止位置是什么?k1和k2在哪里面循环?
重新看了一下代码,说一下现在的理解。
最外层循环i从2到n+1,为什么?首先得知道res里面存放的是n=i时所有的正确括号组合。所以初始时有res=[[None],[“()”]],最终返回的是res[n]。
第二层的循环j是从0到i,目的是把当前res[i]分成前后两部分k1和k2。因为res[i+1]的正确括号组合是通过res[i]得到的,如何得到,就是把res[i]不断的分成前后两部分,然后利用"(" + k1 + “)” + k2来生成新的括号组合。
所以k1的循环是在res[j],k2的循环是在res[i-j-1]。就像最开始k1=res[0],k2=res[1]。
当k1或者k2等于None时,由于新的括号是(" + k1 + “)” + k2,所以将其置为“”。
代码:
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
res = [[None],["()"]]
for i in range(2,n+1):
ans = []
for j in range(i):
pre = res[j]
last = res[i-j-1]
for k1 in pre:
for k2 in last:
if k1 == None:
k1 = ""
if k2 == None:
k2 = ""
ans.append("("+k1+")"+k2)
res.append(ans)
return res[n]
唉,我怎么那么聪明!