leetcode-22-括号生成

题目描述:

 

方法一:暴力

class Solution(object): 
    def generateParenthesis(self, n): 
        def generate(A = []): 
            if len(A) == 2*n: 
                if valid(A): 
                    ans.append("".join(A)) 
            else: 
                A.append('(') 
                generate(A) 
                A.pop() 
                A.append(')') 
                generate(A) 
                A.pop() 
        def valid(A): 
            bal = 0 
            for c in A: 
                if c == '(': 
                    bal += 1 
                else: bal -= 1 
                if bal < 0: return False 
            return bal == 0
  
        ans = [] 
        generate() 
        return ans

 

方法二:回溯

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        ans = []
        def backtrack(S='',left=0,right=0):
            if len(S)==2*n:
                ans.append(S)
                return
            if left < n:
                backtrack(S+"(",left+1,right)
            if right<left:
                backtrack(S+")",left,right+1)
        backtrack()
        return ans

方法三:闭包

class Solution(object): 
    def generateParenthesis(self, N): 
        if N == 0: return [''] 
        ans = [] 
        for c in range(N): 
            for left in self.generateParenthesis(c): 
                for right in self.generateParenthesis(N-1-c): 
                    ans.append('({}){}'.format(left, right)) 
        return ans

 

posted @ 2019-07-10 11:24  oldby  阅读(338)  评论(0)    收藏  举报