22. Generate Parentheses
给定n对括号,计算出n对括号的所有合法组合
方法一、通过数学归纳法来枚举
实现起来非常复杂…
方法二、递归搜索,然后排除非法的括号组合
将每一种括号的组合放在6个字符大小的数组中,共会产生22n个组合,时间复杂度位2(2n)
如何判断非法括号组合:从左往后扫描,当左括号出现次数少于右括号时即非法,如:())(()
方法三、在递归搜索的基础上使用剪枝法
还是递归,但使用剪枝法来排除产生非法的括号组合:左括号可以随便添加,最多到n个,但右括号添加时,必须比左括号数量少,这样就不会产生非法括号组合
代码
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
self.paren_conbi = []
self._gen_paren(0, 0, n, '')
return self.paren_conbi
def _gen_paren(self, left, right, n, result=''):
if left == n and right == n:
self.paren_conbi.append(result)
return
if left < n:
self._gen_paren(left+1, right, n, result+"(")
if right < left and right < n:
self._gen_paren(left, right+1, n, result+")")
递归规模以2倍增大,所以时间复杂度为O(2^n)