解题思路
- 本题要求本质上就是找出所有组合,这里我们可以想出类似于全排列,所以可以选用DFS也就是递归回溯树算法
- 回溯算法步骤:
- 1.创建递归函数并且设置合理参数
- 2.设置递归结束条件
- 3.循环或者选择遍历候选的元素
- 4.调用递归函数
- 5.回退到上一层
class Solution {
public:
void backTrack(vector<string>& res,string& cur,int open,int close,int n){
//递归结束条件,将每一次符合的结果都是2*n的长度,添加到结果集中,并且退出递归。
if(cur.size()==2*n){
res.push_back(cur);
return;
}
//这里主要控制左边括号个个数要小于等于n个,这里要用open<n,因为open默认开始为0
if(open<n){
//在本层中添加候选元素
cur.push_back('(');
//进入下一层,注意这里要对open个数加1
backTrack(res,cur,open+1,close,n);
//回退到上一层
cur.pop_back();
}
if(close < open){
cur.push_back(')');
//进入下一层,注意这里要对close个数加1
backTrack(res,cur,open,close+1,n);
//回退到上一层
cur.pop_back();
}
}
vector<string> generateParenthesis(int n) {
//创建结果集和元素变量
vector<string> res;
string cur;
//调用递归回溯算法
backTrack(res,cur,0,0,n);
return res;
}
};