wl413911

生成括号问题(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+')')

posted on 2020-05-23 17:04  wl413911  阅读(163)  评论(0编辑  收藏  举报