萌新練習寫程式碼的每日一練:括號生成

為了丸山而添彩發表於2020-11-03

題目:

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

 

示例:

輸入:n = 3
輸出:[
       "((()))",
       "(()())",
       "(())()",
       "()(())",
       "()()()"
     ]

思路:用dfs去做,先去思考應該怎麼填,第一個肯定是(,不然當場去世。之後第二個既可以是(也可以是),假設填到了第n個括號,需要去判斷是填(還是),這時候先研究(的條件,顯然只要(沒用完,隨便填,肯定有對應的)來兜底,然後是研究),假設當前狀況是()(),下一個一定是(,不然會破壞平衡,也就是說)的條件為:右括號數量<左括號數量,理清了這個思路之後就可以用遞迴求解了,設left和right是剩餘的(和)的數量,當left==0 and right==0時,終止遞迴併輸出。

程式碼:

class Solution:

    def generateParenthesis(self, n: int) -> List[str]:

        res = []

        cur_str = ''

        def dfs(left, right, cur_str):

            if left==0 and right==0:

                res.append(cur_str)

                return 0

            

            if left > 0:

                dfs(left - 1, right, cur_str + '(')

            if left < right:

                dfs(left, right - 1, cur_str + ')')

            

        dfs(n, n, cur_str)

        return res

題目來自於LeetCode第22題

相關文章