Brackets

Problem

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:

function solution(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 consists only of the following characters: ”(”, ”{”, ”[”, ”]”, ”}” and/or ”)“.

My Solution

failed
function solution(S) {
	let stack = [];

	for (let i = 0; i < S.length; i++) {
		switch (S[i]) {
			case '{':
				stack.push('{');
				break;
			case '[':
				stack.push('[');
				break;
			case '(':
				stack.push('(');
				break;
			case '}':
				if (stack[stack.length - 1] !== '{') {
					return 0;
				} else {
					stack.pop();
				}
				break;
			case ']':
				if (stack[stack.length - 1] !== '[') {
					return 0;
				} else {
					stack.pop();
				}
				break;
			case ')':
				if (stack[stack.length - 1] !== '(') {
					return 0;
				} else {
					stack.pop();
				}
				break;
		}
	}

	return 1;
}
success O(N)
function solution(S) {
	if (S.length % 2 !== 0) return 0;
	const brackets = {
		'}': '{',
		']': '[',
		')': '(',
	};
	let stack = [];

	for (let i = 0; i < S.length; i++) {
		if (S[i] === '{' || S[i] === '[' || S[i] === '(') {
			stack.push(S[i]);
		}

		if (S[i] === '}' || S[i] === ']' || S[i] === ')') {
			if (stack[stack.length - 1] !== brackets[S[i]]) {
				return 0;
			} else {
				stack.pop();
			}
		}
	}

	return stack.length ? 0 : 1;
}