LeetCode (22): Generate Parentheses
2015-09-30 13:08
387 查看
链接: https://leetcode.com/problems/generate-parentheses/
【描述】Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
"((()))", "(()())", "(())()", "()(())", "()()()"
【中文描述】
给定一个数字n,要求写一个方法,生成所有n个括号的可能合法组合。
例如,n=3, 那么3个括号的所有可能组合如上。
————————————————————————————————————————————————————————————
【初始思路】
基本素养,只要见到求所有可能组合的情况(所有可能组合的个数), 首先立马想几个概念词:DFS、递归、回溯。有了这个直觉,你就省去了大量的时间,直接往递归上去套。接下来就是考虑怎么设计递归函数的问题了,速度自然会快很多。
这个题也是如此,回溯、递归。
怎么递归。
我开始的想法是,既然是合法组合,我干脆每次递归的时候直接选择一整个"()"组合作为递归添加项目就可以了。这样子不用考虑不合法的情况了。例如,要求2个括号的合法组合,那么先给一个括号,然后在这个括号的基础上,加第二个括号,无非有如下3种加法,我们用数字来表示可以填入第二个括号的位置:
0( 1 )2
也就是说,我们可以在0、1、2三个位置填入第二个括号,就能生成所有组合了。当然,填入2和填入0的效果是一样,后面讨论如何去重这种情况。
如果如题目要求,n=3时,那么可能的填入情况如下:
public class OtherSolution { /** * 定义全局变量,无需再传值到各个方法 */ static List<String> list = new ArrayList<String>(); public static List<String> generateParenthesis(int n) { /** * 初始状态,左括号和右括号都可以添加n个,所以左右都传了n */ generateLeftsAndRights("",n,n); return list; } /** * DFS方法 * 该方法的本质是,每次调用都深度优先用掉左括号,然后再用掉右括号. * @param subList 记录每次递归时候当前串, 方法将在subList上继续添加括号 * @param left 左括号还剩下的个数 * @param right 右括号还剩下的个数 */ private static void generateLeftsAndRights(String subList,int left, int right){ /** * 最后可能出现的情况, 右括号比左括号先用完, 明显不是合法的串,应剔除 */ if(left > right) return; /** * 左括号还剩得有, 优先用左括号 * 该方法将不断深搜, 直到左括号全部用完 */ if(left > 0){ generateLeftsAndRights(subList + "(", left-1, right); } /** * 开始用右括号 */ if(right > 0){ generateLeftsAndRights(subList + ")", left, right-1); } /** * 基准情况, 各自都用完, 说明已经形成了一个合法的串,将该串加入list返回 */ if(left == 0 && right == 0){ list.add(subList); return; } } }
generateParenthesis
最后,重申,凡是遇到要求全部可能集合、可能性、可能性个数的题目,立马考虑递归回溯求解!!!
相关文章推荐
- Cassandra 常见错误索引
- Matlab中显示法线方向 display normal map in matlab
- maven install 读取jar包时出错;error in opening zip file
- Oracle Study之--Oracle 11g RAC故障(Failed to create or upgrade OLR)
- freeswitch语音信箱(Voice Mail)功能调试
- UIImageView添加边框和阴影
- WebSockets
- 华为-on练习--重复的字符过滤
- 从零自学Hadoop(05):Ambari
- 毕设帮(5188.help)开发日志2——我的构想有市场吗?
- 毕设帮(5188.help)开发日志2——我的构想有市场吗?
- 创建可以重复利用的QML Component--Podcast播放器代码实例
- 一天JavaScript示例-点击图片显示大图片添加鼠标
- ASP.NET动态网站制作(3)--css(2)
- Android-Universal-Image-Loader 图片加载库
- LAMP基础上安装phpMyAdmin及WordPress
- 关于android下的raw文件的问题
- 升级Xcode7后所要更改的配置
- 动态规划——最短编辑距离
- 空净风口已来 谁能“飞得更高”?