Open seungriyou opened 8 months ago
https://leetcode.com/problems/decode-ways/
O(n)
주어진 s에 대해 len(s) + 1 길이의 리스트인 dp를 초기화 한다.
s
len(s) + 1
dp
dp[i] = i 번째 숫자를 보고있을 때, 여기까지 decode 가능한 경우의 수
dp[i]
i
decode 가능한 값의 범위가 1 ~ 26이므로, decode 가능한 경우는 다음과 같이 두 가지이다.
1
26
s[i - 1]
9
dp[i - 1]
s[i - 2:i]
10
dp[i - 2]
따라서 다음과 같이 DP를 수행한다.
dp[0]
dp[1]
dp[2]~ 에 대해서:
dp[2]
def numDecodings(self, s: str) -> int: n = len(s) + 1 dp = [0] * n # base condition dp[0] = 1 dp[1] = 0 if s[0] == "0" else 1 for i in range(2, n): # 1-step 전 if 1 <= int(s[i - 1]) <= 9: dp[i] += dp[i - 1] # 2-step 전 if 10 <= int(s[i - 2:i]) <= 26: dp[i] += dp[i - 2] return dp[n - 1]
O(1)
1D DP를 살펴보면, 이전 값인 dp[i - 1]과 그 이전 값인 dp[i - 2]만 필요하다는 사실을 알 수 있다.
따라서 리스트를 가질 필요 없이, 그 두 값을 저장하는 변수 prev1, prev2를 가지고 값을 트래킹하면 O(1) space로 최적화 할 수 있다.
prev1
prev2
Approach
Idea 1: 1D DP (Space
O(n)
)주어진
s
에 대해len(s) + 1
길이의 리스트인dp
를 초기화 한다.decode 가능한 값의 범위가
1
~26
이므로, decode 가능한 경우는 다음과 같이 두 가지이다.s[i - 1]
1
~9
이내인지dp[i - 1]
s[i - 2:i]
10
~26
이내인지dp[i - 2]
따라서 다음과 같이 DP를 수행한다.
dp[0]
,dp[1]
에 대해서: base condition 설정dp[2]
~ 에 대해서:Idea 2: O(1) DP (Space
O(1)
)1D DP를 살펴보면, 이전 값인
dp[i - 1]
과 그 이전 값인dp[i - 2]
만 필요하다는 사실을 알 수 있다.따라서 리스트를 가질 필요 없이, 그 두 값을 저장하는 변수
prev1
,prev2
를 가지고 값을 트래킹하면O(1)
space로 최적화 할 수 있다.Complexity
O(n)
O(n)
/ (constant)O(1)