题目
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路
- 在生成括号字符串的时候,左括号的数量要保证不小于右括号的数量,因为一旦在当前序列中,右括号的数量多于左括号的数量如“(()))”或者“()())”,那么可能就是无效的。保证前面所说的前提之外,使得左右括号的数量要等于n。所以在递归的时候让左括号的数量小于n,让有括号的数量小于左括号的数量即可。
代码
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
int leftNum = 0, rightNum = 0;
helper( leftNum, rightNum, n, "", res );
return res;
}
void helper( int left, int right, const int& n, string s, vector<string>& res ) {
if ( left == n && right == n ) {
res.push_back( s );
return;
}
if ( left < n )
helper( left+1, right, n, s+'(', res );
if ( right < left )
helper( left, right+1, n, s+')', res );
return;
}
};