22. 括號(hào)生成(Python)

題目

給出 n 代表生成括號(hào)的對(duì)數(shù),請(qǐng)你寫出一個(gè)函數(shù),使其能夠生成所有可能的并且有效的括號(hào)組合。

例如,給出 n = 3,生成結(jié)果為:

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

解答

我們可以采用暴力求解法,生成所有可能的組合,再用【20. 有效的括號(hào)】中的方法一一判斷是否合法,不過(guò)這樣的時(shí)間和空間復(fù)雜度太高,這里我們采用回溯法,在生成括號(hào)時(shí)就按照規(guī)則生成。

定義函數(shù)backtrack,函數(shù)輸入一個(gè)當(dāng)前字符串和當(dāng)前左右括號(hào)各自的數(shù)目,函數(shù)執(zhí)行的操作是嘗試進(jìn)行三個(gè)判斷:

  1. 如果當(dāng)前總數(shù)目已經(jīng)達(dá)到要求,則直接添加到結(jié)果并跳出函數(shù);
  2. 如果當(dāng)前左括號(hào)個(gè)數(shù)合法(小于n),可以再添加一個(gè)左括號(hào);
  3. 如果當(dāng)前右括號(hào)個(gè)數(shù)合法(小于左括號(hào)個(gè)數(shù)),可以再添加一個(gè)右括號(hào)。
class Solution(object):
    def generateParenthesis(self, n):
        ans = []
        def backtrack(S = '', left = 0, right = 0):
            if len(S) == 2 * n:
                ans.append(S)
                return
            if left < n:
                backtrack(S+'(', left+1, right)
            if right < left:
                backtrack(S+')', left, right+1)

        backtrack()
        return ans

如有疑問(wèn)或建議,歡迎評(píng)論區(qū)留言~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容