LeetCode Generate Parentheses
2016-02-20 16:25
429 查看
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:
"((()))", "(()())", "(())()", "()(())", "()()()"
思路分析:这题非常easy想到用DFS。转化成search问题求解,状态就是当前形成的括号字符串。目标是搜索出全部合法括号字符串。搜索树每一次分出两支,即后面加一个左括号或者右括号。可是实现的时候,须要注意维护两个counter,leftRemain和rightRemain用于维护眼下剩余的带插入的左括号和右括号的个数。当leftRemain > rightRemain时,意味着剩余很多其它的左括号,这后面子树中是不可能有合法解的,由于右括号能够找左边已经加入的左括号匹配。而左括号仅仅能和后面新加入的右括号匹配,这样的情况须要减枝直接返回。当leftRemain <=rightRemain时,继续DFS。当leftRemain 和rightRemain都为0时,全部2*n个括号插入完成。加入一个合法解。(注意这里不须要用栈做括号匹配推断是否合法。假设左括号等于右括号数目而且以左括号开头。那么必定合法,全部右括号都能够找到相应的左括号)
AC Code
For example, given n = 3, a solution set is:
"((()))", "(()())", "(())()", "()(())", "()()()"
思路分析:这题非常easy想到用DFS。转化成search问题求解,状态就是当前形成的括号字符串。目标是搜索出全部合法括号字符串。搜索树每一次分出两支,即后面加一个左括号或者右括号。可是实现的时候,须要注意维护两个counter,leftRemain和rightRemain用于维护眼下剩余的带插入的左括号和右括号的个数。当leftRemain > rightRemain时,意味着剩余很多其它的左括号,这后面子树中是不可能有合法解的,由于右括号能够找左边已经加入的左括号匹配。而左括号仅仅能和后面新加入的右括号匹配,这样的情况须要减枝直接返回。当leftRemain <=rightRemain时,继续DFS。当leftRemain 和rightRemain都为0时,全部2*n个括号插入完成。加入一个合法解。(注意这里不须要用栈做括号匹配推断是否合法。假设左括号等于右括号数目而且以左括号开头。那么必定合法,全部右括号都能够找到相应的左括号)
AC Code
public class Solution { public static List<String> res; public List<String> generateParenthesis(int n) { res = new ArrayList<String>(); if(n <= 0) return res; dfs("", n, n); return res; } void dfs(String state, int leftRemain, int rightRemain){ if(leftRemain > rightRemain){ return; } if(leftRemain == 0 && rightRemain == 0){ res.add(state); return; } if(leftRemain > 0){ dfs(state + "(", leftRemain-1, rightRemain); } if(rightRemain > 0){ dfs(state + ")", leftRemain, rightRemain-1); } } }
相关文章推荐
- Linux /dev 自动创建设备节点
- node
- golang之内存使用报告
- php中$_REQUEST、$_POST、$_GET的区别和联系小结
- Spring MVC 学习笔记 Viewresol和View
- facebook 登录开发记录
- DC4C代码阅读(6)——用户节点
- DRAM Memory Rank知识
- minicom使用
- android学习之读取xml文件(使用XmlPullParser)
- spring integration学习入门之tcp通讯
- CodeForces 626D Jerry's Protest
- 《结网》读书笔记
- 【Web基础】HTTP长连接和短连接以及推送技术原理
- 【干货分享】快速玩转Apple Pay开发
- 求php中的request详细用法
- C++内存管理
- Activity之间的跳转
- QSS学习参考的网页
- 搭建持续集成单元测试平台(Jenkins+Ant+Java+Junit+SVN)