22. 括號生成(LeetCode 題解)

題目描述:

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

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

[

"((()))",

"(()())",

"(())()",

"()(())",

"()()()"

]


方法一、暴力法:

思路

我們可以生成所有 2^(2n) 個 '(' 和 ')' 字符構成的序列。然後,我們將檢查每一個是否有效。

算法

為了生成所有序列,我們使用遞歸。長度為 n 的序列就是 '(' 加上所有長度為 n-1 的序列,以及 ')' 加上所有長度為 n-1 的序列。

為了檢查序列是否為有效的,我們會跟蹤平衡,也就是左括號的數量減去右括號的數量的淨值。如果這個值始終小於零或者不以零結束,該序列就是無效的,否則它是有效的。

Java 代碼實現

22. 括號生成(LeetCode 題解)

Python 代碼實現

22. 括號生成(LeetCode 題解)

22. 括號生成(LeetCode 題解)


方法二、回溯法:

思路和算法

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

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

Java 代碼實現

22. 括號生成(LeetCode 題解)

Python 代碼實現

22. 括號生成(LeetCode 題解)

22. 括號生成(LeetCode 題解)


方法三、閉合數:

思路

為了枚舉某些內容,我們通常希望將其表示為更容易計算的不相交子集的總和。

考慮有效括號序列 S 的閉包數:至少存在 index > = 0,使得 S[0], S[1], ..., S[2*index+1] 是有效的。 顯然,每個括號序列都有一個唯一的閉包號。 我們可以嘗試單獨列舉它們。

算法

對於每個閉合數 c,我們知道起始和結束括號必定位於索引 0 和 2*c + 1。然後兩者間的 2*c 個元素一定是有效序列,其餘元素一定是有效序列。

Java 代碼實現

22. 括號生成(LeetCode 題解)

Python 代碼實現

22. 括號生成(LeetCode 題解)

22. 括號生成(LeetCode 題解)


分享到:


相關文章: