forked from DaleStudy/leetcode-study
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEgonD3V.py
65 lines (52 loc) ยท 1.81 KB
/
EgonD3V.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
from typing import List
from unittest import TestCase, main
class Solution:
def numDecodings(self, s: str) -> int:
return self.solve_1(s)
"""
Runtime: 32 ms (Beats 80.36%)
Time Complexity: O(n)
Space Complexity: O(n)
Memory: 16.59 MB (Beats 51.72%)
"""
def solve_1(self, s: str) -> int:
if len(s) == 0:
return 0
if len(s) == 1:
return 0 if int(s) == 0 else 1
if len(s) == 2:
last_one_digit, last_two_digits = int(s[1]), int(s)
if last_one_digit == 0:
return 1 if 10 <= last_two_digits <= 26 else 0
else:
if 0 <= last_two_digits < 10:
return 0
elif 10 <= last_two_digits <= 26:
return 2
else:
return 1
dp = [0] * (len(s) + 1)
dp[0], dp[1], dp[2] = self.solve_1(s[:0]), self.solve_1(s[:1]), self.solve_1(s[:2])
for i in range(3, len(s) + 1):
last_one_digit, last_two_digits = int(s[i - 1]), int(s[i - 2: i])
last_two_digits = int(s[i - 2: i])
if last_one_digit == 0:
dp[i] += dp[i - 2] if 10 <= last_two_digits <= 26 else 0
else:
dp[i] += dp[i - 1] + (dp[i - 2] if 10 <= last_two_digits <= 26 else 0)
return dp[-1]
class _LeetCodeTestCases(TestCase):
def test_1(self):
s = "226"
output = 3
self.assertEqual(Solution.numDecodings(Solution(), s), output)
def test_2(self):
s = "2101"
output = 1
self.assertEqual(Solution.numDecodings(Solution(), s), output)
def test_3(self):
s = "06"
output = 0
self.assertEqual(Solution.numDecodings(Solution(), s), output)
if __name__ == '__main__':
main()