1. 程式人生 > 實用技巧 >LeetCode 22. 括號生成

LeetCode 22. 括號生成

又到了休息大腦時間,抽空刷一題,然而每次做了都好像不是在休息大腦,是在勒緊.......

題目:


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

示例:

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

思路:

掙扎半天寫不出來關係式的確認關係,只好去題解取經,Q_Q 摘自題解大大的一個圖。

很明顯這個題目需要用到遞歸回溯,判斷回溯很簡單,拿到一個問題,你感覺如果不窮舉一下就沒法知道答案,那就可以開始回溯了。

一般回溯的問題有三種:

  1. Find a path to success 有沒有解
  2. Find all paths to success 求所有解
    • 求所有解的個數
    • 求所有解的具體資訊
  3. Find the best path to success 求最優解

方法一:

左括號'('出現的次數取決於n,右括號')'出現取決於左括號出現的數量要大於右括號。

class Solution(object):
    def generateParenthesis(self, n):
        """
        :type n: int
        :rtype: List[str]
        """
        res=[]
        self.dfs(res,n,n,'')
        return res
    def dfs(self,res,left,right,path):
        if left ==0 and right==0:
            res.append(path) 
        if left >0:
            self.dfs(res,left-1,right,path+'(')
        if left<right:
            self.dfs(res,left,right-1,path+')')

執行用時:24 ms, 在所有 Python 提交中擊敗了54.54%的使用者

記憶體消耗:12.9 MB, 在所有 Python 提交中擊敗了11.11%的使用者