Leetcode Python - 22. Generate Parentheses
Leetcode #22 - Generate Parentheses
이번에는 특정 챕터별로 문제들을 풀어보겠습니다. string을 집중적으로 풀어보겠습니다.
리트코드의 문제 22 ‘Generate Parentheses’을 파이썬으로 풀어 보도록 하겠습니다.
전체 코드는 아래와 같습니다.
class Solution:
def generateParenthesis(self, n):
if not n:
return []
elif n == 1:
return ['()']
dp = ['()']
idx = 1
while idx < n:
cur = []
for element in dp:
for e in range(len(element)+1):
tmp = ''
tmp = element[:e] + '()' + element[e:]
if tmp in cur:
continue
cur.append(tmp)
dp = cur
idx += 1
return dp
개선하기
class Solution:
def generateParenthesis(self, n):
if not n:
return []
ret = []
self.dfs(n, 0, 0, '', ret)
return ret
def dfs(self, n, numOpen, numClose, path, ret):
# terminate
if numOpen == n and numClose == n:
ret.append(path)
return
# recursion
if numOpen < n:
self.dfs(n, numOpen+1, numClose, path + '(', ret)
if numClose < numOpen:
self.dfs(n, numOpen, numClose+1, path + ')', ret)
시간복잡도는
- O(2^n) : 함수 한번 실행시마다 2번의 recursion이 실행됨
공간복잡도는
- 최악의 경우 O(2^n) : 무작위로 넣을 수 있다고 가정하면 ret의 한 element 크기 (2n)이 ‘(‘혹은 ‘)’이 계속 나온다.