Generate Parentheses
来源:互联网 发布:windows驱动器被锁定 编辑:程序博客网 时间:2024/05/18 00:21
【题目】
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对圆括号,求形成合法括号的所有组合。
【解析】
用递归的方法,可以归结为子问题去操作。在每次递归函数中记录左括号和右括号的剩余数量,然后有两种选择,一个是放一个左括号,另一种是放一个右括号。需要特别注意的是剩余的右括号不能比左括号少,左括号右括号数量都要大于0。
先放左括号,再放右括号,直到左右括号的数量均==n即可。注意:放括号的过程中,永远不能出现当前右括号的数量大于左括号数量的情况
采用递归的思想,当左括号数大于右括号数时可以加左或者右括号,否则只能加左括号,当左括号数达到n时,剩下全部
左右括号总数相同,且在填充时左括号的个数始终要大于等于右括号的个数。据此递归生成所有的括号对
1. Left代表余下的‘(‘的数目
2. right代表余下的‘)‘的数目
3. 注意right余下的数目要大于left,否则就是非法的,比如,先放一个‘)‘就是非法的。
4. 任何一个小于0,也是错的。
5. 递归的时候,我们只有2种选择,就是选择‘(‘还是选择‘)‘。
6. 递归的时候,一旦在结果的路径上尝试过‘(‘还是选择‘)‘,都需要回溯,
实现:
public class Solution { public ArrayList<String> generateParenthesis(int n) { ArrayList<String> res = new ArrayList<String>(); generate(res, "", 0, 0, n); return res; } public void generate(ArrayList<String> res, String tmp, int lhs, int rhs, int n) { if(lhs == n) { for(int i = 0; i < n - rhs; i++) { tmp += ")"; } res.add(tmp); return ; } generate(res, tmp + "(", lhs + 1, rhs, n); if(lhs > rhs) generate(res, tmp + ")", lhs, rhs + 1, n); } }
0 0
- Generate Parentheses
- Generate Parentheses
- Generate Parentheses
- Generate Parentheses
- Generate Parentheses
- Generate Parentheses
- Generate Parentheses
- Generate Parentheses
- Generate Parentheses
- Generate Parentheses
- Generate Parentheses
- Generate Parentheses
- Generate Parentheses
- Generate Parentheses
- Generate Parentheses
- Generate Parentheses
- Generate Parentheses
- Generate Parentheses
- 求最长等差数列长度
- Scheme
- Android学习笔记之AndroidManifest.xml文件解析
- 解决RecyclerView上拉加载、下拉刷新、Header和Footer的第三方解决方案
- c++ 内存申请释放,构造函数,析构函数,执行顺序
- Generate Parentheses
- Android分包(MultiDex)后编译加速方案
- [SDOI2011] [BZOJ2242] 计算器 - bsgs,快速幂,逆元,map/hash
- PIC单片机MPLAB V8设置技巧
- 关于iOS对textView字数限制上的一些坑以及解决方法
- 【颗粒归仓】(三)原生ajax和jquery-ajax方法的对比
- poj 2155 Matrix 二维树状数组
- [Leetcode] 292. Nim Game
- Tomcat启动未扫描spring注解