22 括號生成

2021-10-08 13:21:09 字數 1387 閱讀 1149

題目描述:

數字 n 代表生成括號的對數,請你設計乙個函式,用於能夠生成所有可能的並且 有效的 括號組合。

示例:

輸入:n = 3

輸出:[

「((()))」,

「(()())」,

「(())()」,

「()(())」,

「()()()」

]方法1:動態規劃

主要思路:

(1)這道題如果想到思路的,其實挺簡單的,主要就是使用已生成的括號組成,來組合成新生成的括號組成;

(2)使用動態陣列vectordp(n+1);其中dp[ i ] 表示當 i 對括號時,可以生成的合法的括號組合,那麼對於 dp[ i ] 的組合,可以通過 dp[ j ]和dp[ i-j-1 ] 的組合,再次組合 而成,在合適的位置插入新的 「()」 即可;

(3)直觀的想,就是dp[ j ]中的 j 對括號,dp[ i-j-1 ]中的 i-j-i 對括號,再加上新增的 1 個括號,總共就是 i 對括號,現在只需要把他們組成一起即可;

class solution}}

}return dp[n]

;//返回n對括號的組合}}

;

方法2:回溯

主要思路:

(1)回溯的主要思路就是在能做的選擇中做選擇,到滿足要求的時候,儲存結果,到不滿足要求的時候,提前返回,返回後,記得恢復原始的狀態;

(2)這裡的選擇就是左,右括號,滿足的條件是左右括號的數量都減少到0,不滿足要求的結果是左邊括號數量大於右邊的括號數量,或者左邊括號數量小於0,或者右邊括號數量小於0;

(3)在做選擇時,直接將左括號或右括號壓入到中間變數str 的結尾,並在返回的時候,彈出即可;

class solution

//選擇左括號

str.

push_back

('(');

--left;

helper

(res,str,left,right)

;++left;

str.

pop_back()

;//彈出

//壓入右括號

str.

push_back

(')');

--right;

helper

(res,str,left,right)

;++right;

str.

pop_back()

;//彈出

} vector

generateparenthesis

(int n)

};

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...