Tasks Details
easy
1.
Brackets
Determine whether a given string of parentheses (multiple types) is properly nested.
Task Score
100%
Correctness
100%
Performance
100%
A string S consisting of N characters is considered to be properly nested if any of the following conditions is true:
- S is empty;
- S has the form "(U)" or "[U]" or "{U}" where U is a properly nested string;
- S has the form "VW" where V and W are properly nested strings.
For example, the string "{[()()]}" is properly nested but "([)()]" is not.
Write a function:
int solution(char *S);
that, given a string S consisting of N characters, returns 1 if 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..200,000];
- string S is made only of the following characters: '(', '{', '[', ']', '}' and/or ')'.
Copyright 2009–2025 by Codility Limited. All Rights Reserved. Unauthorized copying, publication or disclosure prohibited.
Solution
Programming language used C
Time spent on task 1 minutes
Notes
not defined yet
Code: 07:17:38 UTC,
c,
verify,
result: Passed
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
// you can write to stdout for debugging purposes, e.g.
// printf("this is a debug message\n");
#include <string.h>
int size = 0;
int bracket_start(char a)
{
if (a == '{' || a == '[' || a == '(')
return 1;
return 0;
}
int bracket_end(char a)
{
if (a == '}' || a == ']' || a == ')')
{
return 1;
}
return 0;
}
void push(char a, char * stk)
{
*(stk + size) = a;
size++;
}
char stack_end(char stack[])
{
return stack[size - 1];
}
void pop(char * stk)
{
*(stk + (size - 1)) = '\0';
size--;
}
int brackets_match(char a, char b)
{
if (a == '{' && b == '}') return 1;
else if (a == '[' && b == ']') return 1;
else if (a == '(' && b == ')') return 1;
else return 0;
}
int solution(char * S)
{
int i = 0;
int size_S = strlen(S);
// if an empty string
if (size_S == 0) return 1;
// try to do this with char * stack later
char stack[200000];
for (i = 0; i < size_S; i++)
{
// the function just looks if S[i] is a bracket start or not
if (bracket_start(S[i]) )
{
push(S[i], stack);
}
// the function just looks if S[i] is a closing bracket or not
else if (bracket_end(S[i]))
{
if (size == 0) return 0;
if (brackets_match(stack_end(stack), S[i]))
{
pop(stack);
}
}
}
if (size == 0) return 1;
else return 0;
}
Analysis
Code: 07:17:45 UTC,
c,
verify,
result: Passed
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
// you can write to stdout for debugging purposes, e.g.
// printf("this is a debug message\n");
#include <string.h>
int size = 0;
int bracket_start(char a)
{
if (a == '{' || a == '[' || a == '(')
return 1;
return 0;
}
int bracket_end(char a)
{
if (a == '}' || a == ']' || a == ')')
{
return 1;
}
return 0;
}
void push(char a, char * stk)
{
*(stk + size) = a;
size++;
}
char stack_end(char stack[])
{
return stack[size - 1];
}
void pop(char * stk)
{
*(stk + (size - 1)) = '\0';
size--;
}
int brackets_match(char a, char b)
{
if (a == '{' && b == '}') return 1;
else if (a == '[' && b == ']') return 1;
else if (a == '(' && b == ')') return 1;
else return 0;
}
int solution(char * S)
{
int i = 0;
int size_S = strlen(S);
// if an empty string
if (size_S == 0) return 1;
// try to do this with char * stack later
char stack[200000];
for (i = 0; i < size_S; i++)
{
// the function just looks if S[i] is a bracket start or not
if (bracket_start(S[i]) )
{
push(S[i], stack);
}
// the function just looks if S[i] is a closing bracket or not
else if (bracket_end(S[i]))
{
if (size == 0) return 0;
if (brackets_match(stack_end(stack), S[i]))
{
pop(stack);
}
}
}
if (size == 0) return 1;
else return 0;
}
Analysis
Code: 07:17:53 UTC,
c,
final,
score: 
100
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
// you can write to stdout for debugging purposes, e.g.
// printf("this is a debug message\n");
#include <string.h>
int size = 0;
int bracket_start(char a)
{
if (a == '{' || a == '[' || a == '(')
return 1;
return 0;
}
int bracket_end(char a)
{
if (a == '}' || a == ']' || a == ')')
{
return 1;
}
return 0;
}
void push(char a, char * stk)
{
*(stk + size) = a;
size++;
}
char stack_end(char stack[])
{
return stack[size - 1];
}
void pop(char * stk)
{
*(stk + (size - 1)) = '\0';
size--;
}
int brackets_match(char a, char b)
{
if (a == '{' && b == '}') return 1;
else if (a == '[' && b == ']') return 1;
else if (a == '(' && b == ')') return 1;
else return 0;
}
int solution(char * S)
{
int i = 0;
int size_S = strlen(S);
// if an empty string
if (size_S == 0) return 1;
// try to do this with char * stack later
char stack[200000];
for (i = 0; i < size_S; i++)
{
// the function just looks if S[i] is a bracket start or not
if (bracket_start(S[i]) )
{
push(S[i], stack);
}
// the function just looks if S[i] is a closing bracket or not
else if (bracket_end(S[i]))
{
if (size == 0) return 0;
if (brackets_match(stack_end(stack), S[i]))
{
pop(stack);
}
}
}
if (size == 0) return 1;
else return 0;
}
Analysis summary
The solution obtained perfect score.
Analysis
Detected time complexity:
O(N)
expand all
Correctness tests
1.
0.004 s
OK
2.
0.004 s
OK
3.
0.004 s
OK
4.
0.004 s
OK
5.
0.004 s
OK
1.
0.004 s
OK
1.
0.004 s
OK
2.
0.004 s
OK
3.
0.004 s
OK
4.
0.004 s
OK
5.
0.004 s
OK
expand all
Performance tests
1.
0.009 s
OK
2.
0.004 s
OK
3.
0.004 s
OK
1.
0.004 s
OK
2.
0.004 s
OK
3.
0.004 s
OK
1.
0.009 s
OK
multiple_full_binary_trees
sequence of full trees of the form T=(TT), depths [1..10..1], with/without some brackets at the end, length=49K+
sequence of full trees of the form T=(TT), depths [1..10..1], with/without some brackets at the end, length=49K+
✔
OK
1.
0.005 s
OK
2.
0.005 s
OK
3.
0.005 s
OK
4.
0.005 s
OK
5.
0.005 s
OK
broad_tree_with_deep_paths
string of the form [TTT...T] of 300 T's, each T being '{{{...}}}' nested 200-fold, length=120K+
string of the form [TTT...T] of 300 T's, each T being '{{{...}}}' nested 200-fold, length=120K+
✔
OK
1.
0.007 s
OK
2.
0.007 s
OK