22 括號生成

2021-09-25 06:16:38 字數 728 閱讀 9544

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

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

["((()))",

"(()())",

"(())()",

"()(())",

"()()()"

]在leetcode中有關括號的題共有三道,除了這一道的另外兩道是valid parentheses 驗證括號和longest valid parentheses 最長有效括號,這道題給定乙個數字n,讓生成共有n個括號的所有正確的形式,對於這種列出所有結果的題首先還是考慮用遞迴recursion來解,由於字串只有左括號和右括號兩種字元,而且最終結果必定是左括號3個,右括號3個,所以我們定義兩個變數left和right分別表示剩餘左右括號的個數,如果在某次遞迴時,左括號的個數大於右括號的個數,說明此時生成的字串中右括號的個數大於左括號的個數,即會出現')('這樣的非法串,所以這種情況直接返回,不繼續處理。如果left和right都為0,則說明此時生成的字串已有3個左括號和3個右括號,且字串合法,則存入結果中後返回。如果以上兩種情況都不滿足,若此時left大於0,則呼叫遞迴函式,注意引數的更新,若right大於0,則呼叫遞迴函式,同樣要更新引數。**如下:

class solution 

void generate(int left, int right,string it, vector&bp)

}};

22 括號生成

參考回溯法 1.class solution def init self self.ans list defgenerateparenthesis self,n int self.parenthesisiter n,0,return self.ans list defparenthesisiter ...

22 括號生成

插空法對於乙個 可以把另乙個 插到它的任意乙個空位,形成新的組合。此處有3個空位,但插在頭部和尾部是重複的,所以要注意去重,可以用set class solution object def generateparenthesis self,n res set for i in range n 1 t...

22 括號生成

給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 核心思想是 組合演算法的應用。首先介紹組合演算法。從m個元素取n個元素,不考慮取出順序。一種 實現 基於深度遍歷,此方法為倒序遍歷 參考部落格 void dfs int n,in...