leetcode-22 有效的括號
阿新 • • 發佈:2019-02-05
給出 n 代表生成括號的對數,請你寫出一個函式,使其能夠生成所有可能的並且有效的括號組合。
例如,給出 n = 3,生成結果為:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路1:先求出所有可能存在的情況,然後挑選出有效的括號組合。
class Solution(object): def generateParenthesis(self, n): result = [] self.generateAll("", n, 0, result) return result def generateAll(self, current, n, pos, result): if (n*2 == pos): if self.isvalid(current): result.append(current) else: self.generateAll(current + '(', n, pos + 1, result) self.generateAll(current + ')', n, pos + 1, result) def isvalid(self, current): balance = 0 for c in current: if (c == '('): balance = balance + 1 else: balance = balance - 1 if (balance < 0): #右括號比左括號多時小於0 return False return balance == 0 a=Solution() print a.generateParenthesis(3)
思路2:當左括號個數小於右括號時繼續遞迴,這樣能保證生成的組合是正確的
class Solution(object): def generateParenthesis(self, n): """ :type n: int :rtype: List[str] """ self.res = [] self.generateParenthesisIter('',n, n) return self.res def generateParenthesisIter(self, current, r, l): if r ==0 and l==0: self.res.append(current) if l>0: self.generateParenthesisIter(current+'(',r,l-1) if r>0 and r>l: self.generateParenthesisIter(current+')',r-1,l)