###### tags: `LeetCode` `Recursion` `String` `Medium`
# LeetCode #22 [Generate Parentheses](https://leetcode.com/problems/generate-parentheses/)
### (Medium)
數字 n 代表生成括號的對數,請你設計一個函數,用於能夠生成所有可能的並且 有效的 括號組合。
有效括號組合需滿足:左括號必須以正確的順序閉合。
---
這題的重點在於, 如何做出有效括號-只要保持左括號數量不小於右括號即可。
終止條件:
* 右括號數量大於左括號數量, 失敗-直接返回
* 左右括號數量皆等於要求數量, 此為成功條件, 將字串存入答案數組中, 然後返回
* 左或右括號的數量超過給定數, 失敗-直接返回
程式碼中的tmp使用參考與否並不影響正確性, 若使用參考, 需要搭配左(右)括號的插入與彈出(因為所有的字串共用同一個變數), 好處是節省記憶體空間; 不使用參考就不用那麼麻煩, 每次遞迴傳入舊字串加上左(右)括號即可, 但每次呼叫遞迴都需要額外記憶體空間儲存新字串。
---
```
class Solution {
public:
vector<string> generateParenthesis(int n) {
string tmp="";
vector<string> ans;
dfs(n, n, tmp, ans);
return ans;
}
void dfs(int left, int right, string& tmp, vector<string>& ans){
if(left==-1||right==-1)return;
if(right<left)return;
if(!left&&!right){
ans.push_back(tmp);
return;
}
tmp+='(';
dfs(left-1, right, tmp, ans);
tmp.pop_back();
tmp+=')';
dfs(left, right-1, tmp, ans);
tmp.pop_back();
}
};
```