这道题网上很多大神分析,我没有写出来,原因是没有发现一个重要的线索是,在某一个时刻必须要保证左括号数>右括号数,否则现在的字符串就是不满足要求的。对于每一个位置,都有两个选择:放左括号或者放右括号。放左括号没有限制,只要现在手头上还有剩余的左括号就可以放,放右括号有限制条件,不仅仅手头上要有剩余的右括号可以放,而且当前已经有的左括号数必须大于已经有的右括号数,如果当前的左括号数小于等于当前右括号数,那么不能放右括号。所以在当前字符串的基础上,分别对放左括号和放右括号分别进行递归。
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
generate(n, n, "", res);
return res;
}
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);
}
}
};
参考了几个大神的讨论:
http://blog.youkuaiyun.com/yutianzuijin/article/details/13161721
http://www.1point3acres.com/bbs/thread-172641-1-1.html