給出 n 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的並且有效的括號組合。
例如,給出 n = 3,生成結果爲:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/generate-parentheses
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
這裏我們利用回溯法進行求解:
由兩個前提可寫出如下代碼,從空串中逐步遞歸添加左右括號,
1.如果右括號比左括號多,說明無效則返回
2.如果左括號數量超過N,則與題意不符,返回
3.如果左右括號都達到了指定數量,則可以將其添加到數組中保存
4.如果以上條件都沒有滿足,則嘗試加入新的左括號和右括號
回溯的思想體現在兩個遞歸調用上,作爲遞歸的參數“l”,在網下遞歸的過程中,如果有不滿足條件的情況,會不斷回溯(return)到條件開始的位置,再變換“r”往下執行,思想很巧妙。
void dfs(vector<string> &res, int l, int r, int n, string tmp)
{
if(l>n)
return;
if(r>l)
return;
if(r==l&&l==n)
res.push_back(tmp);
dfs(res, l+1, r, n, tmp+'('); //兩重遞歸實現回溯思法
dfs(res, l, r+1, n, tmp+')'); //
}
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
string tmp="";
dfs(res,0,0,n,tmp);
return res;
}
};