-
Notifications
You must be signed in to change notification settings - Fork 0
/
nesting.py
78 lines (57 loc) · 2.19 KB
/
nesting.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
73
74
75
76
77
78
# -*- coding: utf-8 -*-
"""
Author: Niall O'Connor
# https://app.codility.com/programmers/lessons/7-stacks_and_queues/nesting/
A string S consisting of N characters is called properly nested if:
S is empty;
S has the form "(U)" where U is a properly nested string;
S has the form "VW" where V and W are properly nested strings.
For example, string "(()(())())" is properly nested but string "())" isn't.
Write a function:
def solution(S)
that, given a string S consisting of N characters, returns 1 if string S is
properly nested and 0 otherwise.
For example, given S = "(()(())())", the function should return 1 and given
S = "())", the function should return 0, as explained above.
Write an efficient algorithm for the following assumptions:
N is an integer within the range [0..1,000,000];
string S consists only of the characters "(" and/or ")".
# 100% solution https://app.codility.com/demo/results/trainingNUEHPR-QAA/
"""
import time
def solution(S):
"""
Opening parenthesis are pushed and closing parenthesis pop.
If the stack is empty prematurely there are too many closing brackets.
If the stack is populated at the end there are too many opening brackets.
"""
stack = []
opener, closer = '(', ')'
for char in S:
if char == opener:
stack.append(char)
else:
# if there is a mismatch or an empty stack for a closing char its a fail
if not stack:
return 0
else:
stack.pop()
return 0 if stack else 1
if __name__ == '__main__':
tests = (
# Test cases are in pairs of (expected, (args,))
(1, ("(()(())())",)),
(0, ("())",)),
)
for expected, args in tests:
# record performance of solution
tic = time.perf_counter()
res = solution(*args)
toc = time.perf_counter()
print(f'ARGS produced {res} in {toc - tic:0.8f} seconds')
if args[0] is None:
continue # This is just a speed test
try:
assert(expected == res)
except AssertionError as e:
print(f'ERROR {args} produced {res} when {expected} was expected!')