题目描述
解题思路
我们可以采用递归回溯的思路,用两个变量分别记录左括号和有括号使用的次数,然后对于当前的位置i我们可以放置左括号,也可以放置有括号(第一个位置除外)。所以对于每一层递归我们就可以把放置左右括号分别继续递归,相应的左右括号使用次数对应的做+1就可以了。最后递归的边界就是答案字符串等于2倍的n
vector<string> ans;
int num;
// 判断括号是否匹配
void DFS(string s,int left,int right)
{
if(s.size()==num*2)
{
ans.push_back(s);
return;
}
string tmp=s;
// 先放左括号然后再放又阔号
if(left<num)
DFS(tmp+='(',left+1,right);
if(right<left)
DFS(s+=')',left,right+1);
}
vector<string> generateParenthesis(int n) {
num=n;
DFS("(",1,0);
return ans;
}