LeetCode22. Generate Parentheses
2016-08-01 19:57
447 查看
题目链接:https://leetcode.com/problems/generate-parentheses/
大意:给一个整数n,列出n对()所能组成的所有合法排列
例:n=3时,有四种排列["((()))","(()())","(())()","()(())","()()()"]
分析:n对()就表示一共可以放n个左括号和n个右括号,记录下左括号和右括号的使用情况:只要左括号没有放完,任何时刻都可以放;对于右括号限制较多,已放置的右括号数目一定是小于等于放置的左括号数目,所以剩下来的右括号比剩下的左括号多时,才能够允许放右括号。
递归实现:
class Solution {
public:
void generate(int left,int right,string s,vector<string> &rs){
if(left==0&&right==0){
rs.push_back(s);
}
if(left>0){
generate(left-1,right,s+"(",rs);
}
if(right>0&&right>left){
generate(left,right-1,s+")",rs);
}
}
vector<string> generateParenthesis(int n) {
vector<string> rs;
string s="";
generate(n,n,s,rs);
return rs;
}
};
感觉这种思路很容易理解,详细分析见:http://blog.csdn.net/yutianzuijin/article/details/13161721。
大意:给一个整数n,列出n对()所能组成的所有合法排列
例:n=3时,有四种排列["((()))","(()())","(())()","()(())","()()()"]
分析:n对()就表示一共可以放n个左括号和n个右括号,记录下左括号和右括号的使用情况:只要左括号没有放完,任何时刻都可以放;对于右括号限制较多,已放置的右括号数目一定是小于等于放置的左括号数目,所以剩下来的右括号比剩下的左括号多时,才能够允许放右括号。
递归实现:
class Solution {
public:
void generate(int left,int right,string s,vector<string> &rs){
if(left==0&&right==0){
rs.push_back(s);
}
if(left>0){
generate(left-1,right,s+"(",rs);
}
if(right>0&&right>left){
generate(left,right-1,s+")",rs);
}
}
vector<string> generateParenthesis(int n) {
vector<string> rs;
string s="";
generate(n,n,s,rs);
return rs;
}
};
感觉这种思路很容易理解,详细分析见:http://blog.csdn.net/yutianzuijin/article/details/13161721。
相关文章推荐
- 用户和组练习题
- 莫比乌斯反演1002 BZOJ 2005
- Linux学习之MBR
- 笑话来了
- 关于Adodb.Stream 的使用说明
- java线程常用方法详解
- 算术表达式的转换
- iOS初学--UILabel
- nodejs,npm,grunt安装教程
- 莫比乌斯反演1001 BZOJ 2818 莫比乌斯反演例题
- Linux 解压命令大全
- EasyUI 数据网格
- 【HDU】5326 - Work(拓扑)
- UVALive 7503
- java-泛型
- java回忆录—JDK、JRE、JVM之间的联系
- 迷你Dvd管理系统
- ActiveMq学习资料:
- <sdut-ACM> 1175C语言实验——分割整数
- android-intent