遞歸生成括號。有兩個關鍵參數 lCnt,rCnt 分別表示已生成的左括號和有括號的數量。spa
因此一共分出四種狀況:code
① lCnt == n && rCnt == n,將生成的括號放入 vector<string> ans 中blog
② lCnt == n && rCnt < n,只能生成右括號遞歸
③ lCnt == rCnt,只能生成左括號string
④ 生成左括號或者有括號均可io
class Solution { public: vector<string> generateParenthesis(int n) { string s; solve(s, 0, 0, n); return ans; } void solve(string &s, int lCnt, int rCnt, const int &n) { // lCnt: 左括號的數目, rCnt: 有括號的數目 if(lCnt == n && rCnt == n) { ans.emplace_back(s); return ; } if(lCnt == rCnt) { // 左右括號數目同樣, 只能放左括號 s.push_back('('); solve(s, lCnt + 1, rCnt, n); s.pop_back(); } else if(lCnt == n) { // 左括號滿了, 只能放右括號 s.push_back(')'); solve(s, lCnt, rCnt + 1, n); s.pop_back(); } else { // 均可以放 s.push_back('('); solve(s, lCnt + 1, rCnt, n); s.pop_back(); s.push_back(')'); solve(s, lCnt, rCnt + 1, n); s.pop_back(); } } vector<string> ans; };