zoukankan      html  css  js  c++  java
  • 22. Generate Parentheses——本质:树,DFS求解可能的path

    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:

    [
      "((()))",
      "(()())",
      "(())()",
      "()(())",
      "()()()"
    ]
    
    class Solution(object):
        def generateParenthesis(self, n):
            """
            :type n: int
            :rtype: List[str]
    [ "((()))",
      "(()())",
      "(())()",
      "()(())",
      "()()()"]
       ()
       / 
     ()  ()
     /  / 
    () ()()()
            """
            ans = []
            path = []
            self.gen_par_helper(n*2, path, ans)
            return ans
        
        def is_valid_par(self, par):
            stack = []
            for c in par:
                if c == "(":
                    stack.append("(")
                else:
                    if stack:
                        stack.pop()
                    else:
                        return False
            return len(stack) == 0
        
        def gen_par_helper(self, n, path, ans):
            if n == 0:
                if self.is_valid_par(path):
                    ans.append("".join(path))
                return
            for c in "()":
                path.append(c)
                self.gen_par_helper(n-1, path, ans)
                path.pop()                        
    class Solution(object):
        def generateParenthesis(self, n):
            """
            :type n: int
            :rtype: List[str]
    [ "((()))",
      "(()())",
      "(())()",
      "()(())",
      "()()()"]
       ()
       / 
     ()  ()
     /  / 
    () ()()()
            """
            ans = []
            self.gen_par_helper(n, n, "", ans)
            return ans
        
        def gen_par_helper(self, left, right, path, ans):
            if left == 0 and right == 0:
                ans.append(path)
                return
            if left > 0:
                self.gen_par_helper(left-1, right, path+"(", ans)
            if right > 0 and right > left:
                self.gen_par_helper(left, right-1, path+")", ans)                        

    第二种更快,只是不那么容易想到!

  • 相关阅读:
    TCP/IP Checksum 吐槽
    RHEL安装时加载第三方raid驱动
    RHEL Channel Bonding
    关于case语句中声明变量并初始化的注意事项
    Allocators与Criterion的相同点及区别
    BitSet构造函数的两种特例
    Bitset<>用于unordered container时的默认hash函数
    C++ Stream
    C++Exception知识整理
    C++String知识整理
  • 原文地址:https://www.cnblogs.com/bonelee/p/6209381.html
Copyright © 2011-2022 走看看