问题描述:
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
解法一:
只能想到暴力法,排出所有的可能序列,然后再一个一个判断。
看了看官方解法:
只有在我们知道序列仍然保持有效时才添加 ‘(’ or ‘)’,而不是像 方法一 那样每次添加。我们可以通过跟踪到目前为止放置的左括号和右括号的数目来做到这一点,
如果我们还剩一个位置,我们可以开始放一个左括号。 如果它不超过左括号的数量,我们可以放一个右括号。
代码如下:
class Solution {
public:
void backtrack(vector<string>& v,string curr, int open, int close, int max){
if(curr.length() == max * 2){
v.push_back(curr);
return;
}
if(open < max){
backtrack(v,curr + "(",open + 1, close, max);
}
if(close < open){
backtrack(v,curr + ")",open, close + 1, max);
}
}
vector<string> generateParenthesis(int n) {
vector<string> v;
backtrack(v,"",0,0,n);
return v;
}
};
作者:LeetCode
链接:https://leetcode-cn.com/problems/generate-parentheses/solution/gua-hao-sheng-cheng-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。