class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
int l = 0, r = 0; //l: 左括号数,r: 右括号数
dfs(res, "", n, l, r);
return res;
}
private:
void dfs(vector<string>& res, const string &path, int n, int l, int r) {
if (r > l || l > n || r > n) return; //剪枝:每放一个左括号,才可以放一个右括号
if (l == r && l == n) { //即右括号不能先于左括号放置
res.push_back(path); //亦即l >= r;左括号的数量大于或等于
return; //右括号的数量才有可能符合解的条件,继续向下一层递归
}
dfs(res, path + '(', n, l + 1, r);
dfs(res, path + ')', n, l, r + 1);
}
};
class Solution {
private:
//回溯
void backtrack(vector<string>& ans, string& cur, int open, int close, int n) {
if (cur.size() == n * 2) {
ans.push_back(cur);
return;
}
if (open < n) {
cur.push_back('(');
backtrack(ans, cur, open + 1, close, n);
cur.pop_back();
}
if (close < open) {
cur.push_back(')');
backtrack(ans, cur, open, close + 1, n);
cur.pop_back();
}
}
public:
vector<string> generateParenthesis(int n) {
vector<string> result;
string current;
backtrack(result, current, 0, 0, n);
return result;
}
};
LeetCode22. 括号生成
最新推荐文章于 2023-01-16 22:39:29 发布