题目链接: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。