There is a challenge on codewars that asks you to check whether a string of parentheses, brackets, and curly braces is valid.
A string of braces is considered valid if all braces are matched with the correct brace.
I.e. "()"
is valid and "[(])"
is not.
"(){}[]"
is valid and "[({})](]"
is not. Etc.
I’ve been able to create some logic to check for whether or not there are the right number of opening and closing braces.
ATTEMPT:
function validBraces(braces) { let parenCount = 0; let squareBracketCount = 0; let curlyBraceCount = 0; for (let i =0; i < braces.length; i++) { let character = braces[i]; if (character === "(") { parenCount -= 1; } if (character === ")") { parenCount += 1; } if (character === "[") { squareBracketCount -= 1; } if (character === "]") { squareBracketCount += 1; } if (character === "{") { curlyBraceCount -= 1; } if (character === "}") { curlyBraceCount += 1; } } if (parenCount === 0 && squareBracketCount === 0 && curlyBraceCount === 0) { return true; } else { return false; } }
But I’ve not been able to come up with a way to check for whether or not the opening brace “closes” before the next type of brace opens.
Maybe something like this?
if ( (firstChar === "(" && lastChar === ")") || (firstChar === "{" && lastChar === "}") || (firstChar === "[" && lastChar === "]") ) { return true; } else { return false; }
But then this would have to be checked in accordance with my other if-statement
…(?)
EDIT: Key to understanding this challenge is that the closing brace must either come directly after the opening brace or it must be “parallel” – in symmetry with the other.
Advertisement
Answer
You can use array
to keep track of previously appeared opening braces and once any closing tag appears you need to match it with the last value of array if it’s matching pop the last value out of else else return false, in the end if you’re left with empty array return true else return false
function validBraces(braces){ let tracer = [] for(let i=0;i < braces.length; i++){ if ( braces[i] === "(" || braces[i] === "{" || braces[i] === "["){ tracer.push(braces[i]) } else{ if(tracer.length === 0) return false let lastValue = tracer[tracer.length-1] if( (braces[i] === ']' && lastValue === '[') || (braces[i] === '}' && lastValue === '{') || (braces[i] === ')' && lastValue === '(')) { tracer.pop() } else { break; } } } return tracer.length === 0 } console.log(validBraces( "()" )) // true console.log(validBraces( "[]" )) // true console.log(validBraces( "{}" )) // true console.log(validBraces( "(){}[]" )) // true console.log(validBraces( "([{}])" )) // true console.log(validBraces( "(}" )) // false console.log(validBraces( "[(])" )) // false console.log(validBraces( "({})[({})]" )) // true console.log(validBraces( "(})" )) // false console.log(validBraces( "(({{[[]]}}))" )) //true console.log(validBraces( "{}({})[]" )) // true console.log(validBraces( ")(}{][" )) // false console.log(validBraces( "())({}}{()][][" )) // false console.log(validBraces( "(((({{" )) // false console.log(validBraces( "}}]]))}])" )) // false