问题描述
数字n代表生成括号的对数,请设计一个函数,用于能够生成所有可能的并且有效的括号组合。
示例:
输入:n = 3
输出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
解决方案
这道题的第一思路是用全排列把所有的括号可能排出来,再用栈的思路来检测是否为有效括号组。然后去百度了下全排列的算法代码,要用到回溯,而且代码很长。既然全排要用回溯,还不如直接用回溯算了。然后就发现,这个括号很像二叉树。
class Solution:def generateParenthesis(self, n):res = []self.dfs(res, n, n, '')return res def dfs(self, res, left, right, path):#遍历深度达到n及左右括号都用完了时返回path路径if left==right==0:res.append(path)return#插入右括号的时机if left<right:self.dfs(res,left,right-1,path+')')#插入左括号的时机if left>0:self.dfs(res,left-1,right,path+'(')x=Solution()print(x.generateParenthesis(n=3)) |
---|
结语
回溯法主要可以用在三种问题上(前题是需要穷举):
1 .判断有没有解
2.求所有解的数量或具体信息
3.求最优解
这道题就属于第二种。
回溯法的基本套路是使用两个变量: res 和 path,res 表示最终的结果,path 保存已经走过的路径。如果搜到一个状态满足题目要求,就把 path 放到 res 中。