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)                        
复制代码

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

posted @   bonelee  阅读(256)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示