本题思路主要还是几种回溯法的使用,可以想象为二叉树,一直向左子树加入左括号,当加入的左括号到达最大限制,就回退到上一层,然后自然需要向右子树加入右括号,然后依次递归,还是需要注意递归的终止条件,在左右括号都达到最大的时候则需要将本次的结果存在最终的字符串数组中,本题相关报错
// class Solution {
// public:
// vector<string> generateParenthesis(int n) {
// vector<string> res;
// string path;
// dfs(path,0 ,0, n, res);
// return res;
// }
// void dfs(string path,int left, int right, int n, vector<string> &res)
// {
// if(left == n && right == n)
// {
// res.push_back(path);
// return ;
// }
// // 左子树的深度就是[0, n)
// if(left < n)
// {
// // 左子树加左括号
// path += "(";
// // 向下一层,继续递归直到走到对应深度
// dfs(path, left + 1, right, n, res);
// // 返回上一层
// path.pop_back();
// }
// // 当右子树的深度小于左子树的时候就可以继续增加
// if(right < left)
// {
// path += ")";
// // 右子树同样向下增加一层然后通过递归来添加右括号
// dfs(path, left, right + 1, n, res);
// // path.pop_back();
// }
// }
// };
// class Solution {
// public:
// vector<string> generateParenthesis(int n) {
// vector<string> res;
// int lc = 0, rc = 0;
// dfs(res, "", n, lc, rc);
// return res;
// }
// void dfs(vector<string>& res, string path, int n, int lc, int rc) {
// if (rc > lc || lc > n || rc > n) return;
// if (lc == rc && lc == n) {
// res.push_back(path);
// return;
// }
// dfs(res, path + '(', n, lc + 1, rc);
// dfs(res, path + ')', n, lc, rc + 1);
// }
// };
class Solution {
public:
vector<string> res;
vector<string> generateParenthesis(int n) {
dfs("", n, n);
return res;
}
// 这里必须是const否则报错
void dfs(const string& tmp, int left, int right)
// void dfs(string& tmp, int left, int right)
{
if(left < 0 || left > right)
return ;
if(left == 0 && right == 0)
{
res.push_back(tmp);
return ;
}
dfs(tmp + '(', left - 1, right);
dfs(tmp + ')', left, right - 1);
}
};