1. 程式人生 > >【LeetCode每天一題】Generate Parentheses(創造有效的括弧)

【LeetCode每天一題】Generate Parentheses(創造有效的括弧)

bject 個數 產生 clas 可能 直接 sof 數量 set

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         

【LeetCode每天一題】Generate Parentheses(創造有效的括弧)