zoukankan      html  css  js  c++  java
  • 生成括号问题(22)


    链接:https://leetcode-cn.com/problems/generate-parentheses

    数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
    示例:
    输入:n = 3
    输出:[
           "((()))",
           "(()())",
           "(())()",
           "()(())",
           "()()()"
         ]

    解决方案:

    class Solution(object):
        '''
        其实这个问题,等价于在深度为n的二叉树,从根节点到叶子节点不断生长,构建符合条件的路径。每生长一层,或者向左走,或者向右走。
            需要满足三个条件:
                1、首先添加left括号
                2、当right括号数目 小于 left括号数目时, 才可以添加right括号
                3、left括号数目小于n时,可以一直添加下去
                4、直到 left括号 和 right括号都等于n,此时停止生长,返回结果(其实返回的就是在二叉树中走过的路径)
            '''
        def generateParenthesis(self, n):
            """
            :type n: int
            :rtype: List[str]
            """
            self.res_list = []
            self._process(0,0,n,"")
            return self.res_list

        def _process(self,left,right,n,result):
            # base case 递归终止条件
            if left == n and right == n:
              self.res_list.append(result)
              return

            ## 下面两句,保证了括号添加以正确行式进行添加

            # 如果左括号小于n,添加左括号,继续递归
            if left < n:
                self._process(left+1,right,n,result= result+'(')
            # 如果 右括号 小于 左括号,添加右括号,基础递归 
            if right < left:
                self._process(left,right+1,n,result = result+')')
  • 相关阅读:
    51nod 1412 AVL树的种类
    bzoj1093 [ZJOI2007]最大半联通子图 缩点 + 拓扑序
    bzoj1116 [POI2008]CLO 边双联通分量
    luoguP4366 [Code+#4]最短路 最短路
    51nod1821 最优集合 贪心
    51nod2000 四边形分割平面 规律题
    luoguP3250 [HNOI2016]网络 树链剖分 + 堆
    [Luogu5162]WD与积木(多项式求逆)
    [Luogu5161]WD与数列(后缀数组/后缀自动机+线段树合并)
    [Luogu5106]dkw的lcm
  • 原文地址:https://www.cnblogs.com/wl413911/p/12943398.html
Copyright © 2011-2022 走看看