思想:每一个合法组合的首末位是确定的,即所有的组合都为(####)。其中,根据排列组合的知识可以知道,我们还有2n-2个位置需要确定。其中,只需要确定左括号(的位置就可以了。
代码解释:这里的基本思想是一个一个加,先从一个左括号(开始,一个循环之后变成[((,()],然后变成[(((,((),()(,())]。但是为了括号序列的合理性,需要排除右括号比左括号多的情况,所以需要记录左括号的个数k。当左括号的个数等于所需括号的个数时,将该序列的右括号个数补齐,填入输出序列result中。
变量解释:lstmp为一个暂时变量,为了更新每次ls的值。
class Solution:
def generateParenthesis(self , n: int) -> List[str]:
# write code here
if n < 1:
return []
if n == 1:
return ['()']
a = '('
b = ')'
result = []
ls = [[1,'(']]
counter = 1
while len(ls) > 0:
lstmp = []
for ele in ls:
k = ele[0]
strtmp = ele[1]
if k+1 == n:
result.append(strtmp+a+b*(2*n-counter-1))
else:
lstmp.append([k+1,strtmp+a])
if counter-k < k:
## ')'smaller than'('
lstmp.append([k,strtmp+b])
counter += 1
ls = lstmp
return result