1. 程式人生 > >leetcode-22 有效的括號

leetcode-22 有效的括號

給出 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)