forked from learning-zone/python-basics
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdecode_string.py
72 lines (45 loc) · 1.45 KB
/
decode_string.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
66
67
68
69
70
71
72
def decode(s):
""" Decodes a string. A valid code is a sequence of numbers and letters, always starting with a number and ending with letter(s).
Each number tells you how many characters to skip before finding a good letter. After each good letter should come the next next number.
>>> decode("0h")
'h'
>>> decode("2abh")
'h'
>>> decode("0h1ae2bcy")
'hey'
"""
# Runtime: O(n)
# Spacetime: O(n)
decoded = ''
for l in range(len(s)):
try:
int(s[l])
decoded += s[int(s[l]) + l + 1]
except:
continue
return decoded
def decode_2(s):
""" Decodes a string. A valid code is a sequence of numbers and letters, always starting with a number and ending with letter(s).
Each number tells you how many characters to skip before finding a good letter. After each good letter should come the next next number.
>>> decode_2("0h")
'h'
>>> decode_2("2abh")
'h'
>>> decode_2("0h1ae2bcy")
'hey'
"""
# Runtime: O(n)
# Spacetime: O(n)
def _decode_2(s, decoded, i):
if i >= len(s):
return decoded
current = s[i]
if current.isdigit():
decoded += s[int(current) + i + 1]
return _decode_2(s, decoded, i+1)
return _decode_2(s, '', 0)
if __name__ == '__main__':
import doctest
results = doctest.testmod()
if results.failed == 0:
print 'ALL TESTS PASSED!'