LeetCode22 括號生成 解法與分析

問題描述:

給出 n 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的並且有效的括號組合。

例如,給出 n = 3,生成結果爲:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

解法一:

只能想到暴力法,排出所有的可能序列,然後再一個一個判斷。

看了看官方解法:

只有在我們知道序列仍然保持有效時才添加 ‘(’ or ‘)’,而不是像 方法一 那樣每次添加。我們可以通過跟蹤到目前爲止放置的左括號和右括號的數目來做到這一點,

如果我們還剩一個位置,我們可以開始放一個左括號。 如果它不超過左括號的數量,我們可以放一個右括號。

代碼如下:

class Solution {
public:
    void backtrack(vector<string>& v,string curr, int open, int close, int max){
        if(curr.length() == max * 2){
            v.push_back(curr);
            return;
        }
        if(open < max){
            backtrack(v,curr + "(",open + 1, close, max);

        }
        if(close < open){
            backtrack(v,curr + ")",open, close + 1, max);
        }
    }
    vector<string> generateParenthesis(int n) {
        vector<string> v;
        backtrack(v,"",0,0,n);
        return v;
    }
};

作者:LeetCode
鏈接:https://leetcode-cn.com/problems/generate-parentheses/solution/gua-hao-sheng-cheng-by-leetcode/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章