个人思路总结:
俗话说,任何问题都是可以通过暴力法解决的。我们可以找出所有可能的排序,然后一一比对是否符合规则,但这种方法太低效。
==递归回溯法:==只有在我们知道序列仍然保持有效时才添加 ‘(’ 或 ‘)’,而不是像暴力法那样每次添加。我们可以通过跟踪到目前为止放置的左括号和右括号的数目来做到这一点,如果我们还剩一个位置,我们可以开始放一个左括号。 如果它不超过左括号的数量,我们可以放一个右括号。
代码如下:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> result;
generate(result,"",0,0,n);
return result;
}
//count1为当前左括号数目,count2为当前右括号数目
void generate(vector<string>& res, string ans, int count1, int count2, int n)
{
if(count1==n && count2==n)
{
res.push_back(ans);
return;
}
if(count1<n)
{
generate(res, ans+"(", count1+1, count2, n);
}
if(count2<count1)
{
generate(res, ans+")", count1, count2+1, n);
}
}
};