回溯算法求解,括號對數組合問題

給出 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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章