題目描述
解題思路
我們可以採用遞歸回溯的思路,用兩個變量分別記錄左括號和有括號使用的次數,然後對於當前的位置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;
}