问题描述 数字n代表生成括号的对数,请设计一个函数,用于能够生成所有可能的并且有效的括号组合。 示例: 输入:n = 3 输出:[ "((()))", "(()())", "(())()", "()(())", "()()()" ] 解决方案 这道题的第一思路是用全排列把所有的括号可能排出来,再用栈的思路来检测是否为有效括号组。然后去百度了下全排列的算法代码,要用到回溯,而且代码很长。既然全排要用回溯,还不如直接用回溯算了。然后就发现,这个括号很像二叉树。 图2.1思路分析二叉树示意 简单的画了下。众所周知树和回溯可是老伙伴了。代码实现的主要突破是括号的插入方法和向下搜索的条件。借用栈的思路可以知道插入‘)’时必须有‘(’而且‘(’的数量必须比‘)’的数量多有了这一点就可以开始代码了。 python代码:
结语 回溯法主要可以用在三种问题上(前题是需要穷举): 1 .判断有没有解 2.求所有解的数量或具体信息 3.求最优解 这道题就属于第二种。 回溯法的基本套路是使用两个变量: res 和 path,res 表示最终的结果,path 保存已经走过的路径。如果搜到一个状态满足题目要求,就把 path 放到 res 中。 编 辑 | 王楠岚 责 编 | 王自强 where2go 团队 |
|