Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n = 3, a solution set is
[
"((()))", "(()())", "(())()", "()(())", "()()()" ]
思路
比较简单的方法是暴力破解法我们生成所有可能的组合,然后逐一去判断他们是否满足要求,最后输出一个满足的集合。但是这种方法当n非常大时,会存在时间复杂度非常高的问题。这会导致运行时间超时。
时间复杂度为(22nn), 对于n个字符串可以产生22n个结果,然后每一个结果需要判断其是否有效,遍历需要O(n)。空间复杂度为(22nn)。
另外一种方法是,我们可以根据有效括弧的规则来进行判断,当'('不为0时,可以一直添加,而')'的添加,我们需要满足他的添加个数不能大于'('的数量,否则直接为无效的括弧。
暴力破解思路
1 class Solution(object): 2 def generateParenthesis(self, n): 3 def generate(A = []): 4 if len(A) == 2*n: # 当'(',')'都添加完毕之后,先进行判断是否有效,有效添加进结果集。 5 if valid(A): 6 ans.append("".join(A)) 7 else: 8 A.append('(') # 递归方法产生, 每一次时都会有两种选择,添加'('或者')'。 9 generate(A) 10 A.pop() 11 A.append(')') 12 generate(A) 13 A.pop() 14 15 def valid(A): # 判断当前是否是有效括弧。 16 bal = 0 17 for c in A: 18 if c == '(': bal += 1 19 else: bal -= 1 20 if bal < 0: return False 21 return bal == 0 22 23 ans = [] # 存储有效结果的括弧 24 generate() 25 return ans
第二种解决代码
1 class Solution(object): 2 def generateParenthesis(self, n): 3 """ 4 :type n: int 5 :rtype: List[str] 6 """ 7 if n <2: # 小于2时,直接根据值进行返回。 8 return '' if n == 0 else ['()'] 9 res = [] # 存储结果集 10 s='' 11 self.get_res(s, res, 0, 0 , n) # 调用制造函数 12 return res 13 14 def get_res(self, s, res, left,right, n): 15 if len(s) == n*2: # 直接将结果添加进结果集中 16 res.append(s) 17 return 18 if left < n: # 左括号小于n时,直接进行添加。并且left+1 19 self.get_res(s+'(', res, left+1, right, n) 20 if right < left: 21 self.get_res(s+')', res, left, right+1, n) 22