題目:
題解:
- 回溯法經典題型
- 題目中的 n 表示括號的個數,那麼我們用 n 來表示左括號的個數
'('
,那麼每使用一個左括號,同時產生一個可使用的右括號數')'
,可以保證不會產生無效括號。- 可行解的生成:可使用的左右括號數都爲0時,表示生成一個有效的括號。
代碼如下:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
backtrack(res,n,0,"");
return res;
}
//回溯:left表示可使用的做左括號數'(',right表示可使用的右括號數')'
void backtrack(vector<string>& res,int left,int right,string track){
if(!right&&!left)res.push_back(track);
else{
/*使用一個左括號,同時可使用右括號數加1,這樣可避免生成無效括號*/
if(left>0)backtrack(res,left-1,right+1,track+'(');
/*可使用的右括號數大於0,則用來補齊原來的左括號*/
if(right>0)backtrack(res,left,right-1,track+')');
}
}
};