LeetCode 22. 括号生成

又到了休息大脑时间,抽空刷一题,然而每次做了都好像不是在休息大脑,是在勒紧.......

题目:


数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例:

输入:n = 3
输出:[
       "((()))",
       "(()())",
       "(())()",
       "()(())",
       "()()()"
     ]

思路:

挣扎半天写不出来关系式的确认关系,只好去题解取经,Q_Q 摘自题解大大的一个图。

很明显这个题目需要用到递归回溯,判断回溯很简单,拿到一个问题,你感觉如果不穷举一下就没法知道答案,那就可以开始回溯了。

一般回溯的问题有三种:

  1. Find a path to success 有没有解
  2. Find all paths to success 求所有解
    • 求所有解的个数
    • 求所有解的具体信息
  3. Find the best path to success 求最优解

方法一:

左括号'('出现的次数取决于n,右括号')'出现取决于左括号出现的数量要大于右括号。

class Solution(object):
    def generateParenthesis(self, n):
        """
        :type n: int
        :rtype: List[str]
        """
        res=[]
        self.dfs(res,n,n,'')
        return res
    def dfs(self,res,left,right,path):
        if left ==0 and right==0:
            res.append(path) 
        if left >0:
            self.dfs(res,left-1,right,path+'(')
        if left<right:
            self.dfs(res,left,right-1,path+')')

执行用时:24 ms, 在所有 Python 提交中击败了54.54%的用户

内存消耗:12.9 MB, 在所有 Python 提交中击败了11.11%的用户

posted @ 2020-07-24 16:50  萧蔷ink  阅读(99)  评论(0编辑  收藏  举报