---
# System prepended metadata

title: 22. Generate Parentheses
tags: [leetcode]

---

# 22. Generate Parentheses

#### Difficulty: Medium
link: https://leetcode.com/problems/generate-parentheses/

### 1. Backtracking  
#### $O(4^n/sqrt(n))$ runtime, $O(4^n/sqrt(n))$ space

如果只是要計算有幾種可能，那可以用DP解，但要列出所有情況的話，就要用backtracking。

這裡用函數dfs來做backtracking，設定終止條件和繼續走下去的條件。

每次有兩條路可以選擇，分別是左括號和右括號，path紀錄走過的路徑，left和right分別紀錄左括號和右括號累積的數量。

終止條件是path走到底有2n個左右括號。若左括號數量還未到上限n，還能繼續走左括號；若左括號數量比右括號多，還能繼續走右括號。

複雜度計算與Catalan number有關，可以參考Leetcode官方解法。

##### python
```python=
class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        results = []
        
        def dfs(path, left, right):
            if len(path) == 2 * n:
                results.append(path)
                return
            
            if left < n:
                dfs(path + "(", left + 1, right)
            
            if right < left:
                dfs(path + ")", left, right + 1)
        
        dfs("", 0, 0)
        
        return results
```


### 2. Closure Number  
#### $O(4^n/sqrt(n))$ runtime, $O(4^n/sqrt(n))$ space

神奇解法！

##### python
```python=
class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        if n == 0: 
            return ['']
        
        ans = []
        for c in range(n):
            for left in self.generateParenthesis(c):
                for right in self.generateParenthesis(n-1-c):
                    ans.append('({}){}'.format(left, right))
        
        return ans
```


###### tags: `leetcode`