又到了休息大脑时间,抽空刷一题,然而每次做了都好像不是在休息大脑,是在勒紧.......
题目:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路:
挣扎半天写不出来关系式的确认关系,只好去题解取经,Q_Q 摘自题解大大的一个图。
很明显这个题目需要用到递归回溯,判断回溯很简单,拿到一个问题,你感觉如果不穷举一下就没法知道答案,那就可以开始回溯了。
一般回溯的问题有三种:
- Find a path to success 有没有解
- Find all paths to success 求所有解
- 求所有解的个数
- 求所有解的具体信息
- 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%的用户