Codility : Brackets Determine whether a given string of parentheses is properly nested
Your first condition in the closing brackets block checks whether your stack has the size != 1. I assume this is meant to check that you don't have any leftover opening brackets, which is a good idea. However, you'll miss this entire check if your last char isn't a closing bracket/paren/..
This for example would fail for an input like (((
.
A simple fix would be replacing this condition with a check after the loop ends that the stack is indeed empty.
This is my C# simple solution which got 100% for Correctness and 100% Performance. Time Complexity is O(N). https://codility.com/demo/results/trainingRVS3SF-DC6/
using System;
using System.Collections.Generic;
class Solution {
public int solution(string S) {
// Return 1 if string size is 0
if(S.Length==0) return 1;
Stack<char> brackets = new Stack<char>();
foreach(char c in S){
if(c=='['||c=='{'||c=='('){
brackets.Push(c);
}
else{
// return 0 if no opening brackets found and
// first bracket is a closing bracket
if(brackets.Count==0) return 0;
if(c==')'){
if(brackets.Peek()=='(') brackets.Pop();
else return 0;
}
if(c=='}'){
if(brackets.Peek()=='{') brackets.Pop();
else return 0;
}
if(c==']'){
if(brackets.Peek()=='[') brackets.Pop();
else return 0;
}
}
}
if(brackets.Count==0) return 1;
return 0;
}
}
Simple java solution, 100/100
public int solution(String S) {
Deque<Character> stack = new ArrayDeque<Character>();
for(int i = 0; i < S.length(); i++) {
char c = S.charAt(i);
switch (c) {
case ')':
if (stack.isEmpty() || stack.pop() != '(')
return 0;
break;
case ']':
if (stack.isEmpty() || stack.pop() != '[')
return 0;
break;
case '}':
if(stack.isEmpty() || stack.pop() != '{')
return 0;
break;
default:
stack.push(c);
break;
}
}
return stack.isEmpty() ? 1 : 0;
}