Generate Parentheses
来源:互联网 发布:fifa2017曼联球员数据 编辑:程序博客网 时间:2024/05/17 07:18
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:
"((()))", "(()())", "(())()", "()(())", "()()()"
思路:因为这个存储结构类似于树,所以可以用遍历的方法,递归求解
该问题解的个数就是卡特兰数,但是现在不是求个数,而是要将所有合法的括号排列打印出来。
该问题和《编程之美》的买票找零问题一样,通过买票找零问题我们可以知道,针对一个长度为2n的合法排列,第1到2n个位置都满足如下规则:左括号的个数大于等于右括号的个数。所以,我们就可以按照这个规则去打印括号:假设在位置k我们还剩余left个左括号和right个右括号,如果left>0,则我们可以直接打印左括号,而不违背规则。能否打印右括号,我们还必须验证left和right的值是否满足规则,如果left>=right,则我们不能打印右括号,因为打印会违背合法排列的规则,否则可以打印右括号。如果left和right均为零,则说明我们已经完成一个合法排列,可以将其打印出来。通过深搜,我们可以很快地解决问题,针对n=2,问题的解空间如下:
按照这种思路,代码如下:
void generate(int leftNum,int rightNum,string s,vector<string> &result) { if(leftNum==0&&rightNum==0) { result.push_back(s); } if(leftNum>0) { generate(leftNum-1,rightNum,s+'(',result); } if(rightNum>0&&leftNum<rightNum) { generate(leftNum,rightNum-1,s+')',result); } }
public class Solution { public List<String> generateParenthesis(int n) { if(n<0) return null; int left = n; int right = n; String s = ""; List<String> list = new ArrayList<String>(); genera(left,right,list,s); return list; } public void genera(int left,int right,List list,String s) { if(left==0 && right==0) { list.add(s); } if(left>0) { genera(left-1,right,list,s+"("); } if(left<right && right>0) { genera(left,right-1,list,s+")"); } }}其中left表示剩余的左括号的个数,即未加入到字符串s里的左括号的个数。在left大于0,且left<right的情况下,每一次递归都有2条路径,代表了2中不同的自合形式,当left=0后每一次递归只剩下一条路径(只剩下右括号可以加入到字符串中),当left>right时,每一次递归也只剩下一条路径(此时必须右括号加入字符串中)
参考:http://blog.csdn.net/yutianzuijin/article/details/13161721
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
- 虚拟机Hadoop主机无法访问问题解决
- iOS沙盒路径的查看和使用
- NSLayoutConstraint-代码实现自动布局的函数用法说明
- android ListView item数值修改后刷新问题
- 处理机调度--实时系统中的调度
- Generate Parentheses
- 使用SecureCRT连接ubuntu
- MACD指标#我来学炒股#
- Spring应用的几种事务处理机制
- 背景属性设置
- upload pictures in C#
- Oracle中根据某一列的值排序
- 第二章:nagios监控for windows
- Ajax的原理和应用(给公司做所的培训)