-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDaily_coding_problem_7.py
More file actions
76 lines (61 loc) · 2.06 KB
/
Daily_coding_problem_7.py
File metadata and controls
76 lines (61 loc) · 2.06 KB
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
66
67
68
69
70
71
72
73
74
75
76
""" Problem:
Given the mapping a = 1, b = 2, ... z = 26, and an encoded message, count the number of ways it can be decoded.
For example, the message '111' would give 3, since it could be decoded as 'aaa', 'ka', and 'ak'.
You can assume that the messages are decodable. For example, '001' is not allowed.
"""
def decoded(message, memo=True):
len_ = len(message)
if memo:
array = [None] * (len_ + 1)
return decoded_memo(message, array, len_)
return decoded_recursive(message, len_)
# Recurrence:
def decoded_recursive(message, i):
if i == 0:
return 1
current = len(message) - i
if message[current] == '0':
return 0
result = decoded_recursive(message, i - 1)
if i >= 2 and int(message[current:current+2]) <= 26:
result += decoded_recursive(message, i - 2)
return result
# Memoization and recurrence:
def decoded_memo(message, array, i):
if i == 0:
return 1
current = len(message) - i
if message[current] == '0':
return 0
if array[current] is not None:
return array[current]
result = decoded_memo(message, array, i - 1)
if i >= 2 and int(message[current:current + 2]) <= 26:
result += decoded_memo(message, array, i - 2)
array[current] = result
return result
def main():
# Only recurrence:
assert decoded('', False) == 1
assert decoded('0', False) == 0
assert decoded('1', False) == 1
assert decoded('12', False) == 2
assert decoded('26', False) == 2
assert decoded('111', False) == 3
assert decoded('123', False) == 3
assert decoded('10100', False) == 0
assert decoded('11111', False) == 8
assert decoded('12121', False) == 8
# Using memoization and recurrence:
assert decoded('') == 1
assert decoded('0') == 0
assert decoded('1') == 1
assert decoded('12') == 2
assert decoded('26') == 2
assert decoded('111') == 3
assert decoded('123') == 3
assert decoded('10100') == 0
assert decoded('11111') == 8
assert decoded('12121') == 8
if __name__ == '__main__':
main()