# 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`