22 括號生成

2021-09-28 17:20:50 字數 729 閱讀 2412

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

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

["((()))",

"(()())",

"(())()",

"()(())",

"()()()"

]核心思想是 組合演算法的應用。

首先介紹組合演算法。從m個元素取n個元素,不考慮取出順序。

一種**實現:(基於深度遍歷,此方法為倒序遍歷)

參考部落格:

void dfs(int n, int x) 

for (int i = n; i > 0; i--)

}

此問題可簡化為從2*n個元素中選擇n個元素為( ,其他元素為),簡單思考可以得出,第乙個元素必為(,最後乙個元素必為)。即問題變為從2*n-2個元素中選擇n-1個元素

但並不是每種組合都符合要求,括號匹配時刻必須滿足( 的數量不小於 )的數量。可以在生成字串時對括號進行計數。

class solution 

public static void dfs(int n, int x,int r,int a)

}}

注:leetcode中慎用類變數,上例中arraylist若不每次在generateparenthesis()方法中進行初始化,則會出現上個測試用例的結果仍然在下個測試用例的list中,算是乙個小bug吧

22 括號生成

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

22 括號生成

給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 在leetcode中有關括號的題共有三道,除了這一道的另外兩道是valid parentheses 驗證括號和longest valid parentheses 最長有效括號,這...

22 括號生成

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