Need to find open and closed bracket, if the sequence of opening and closing brackets is violated, then return false.
But if don’t revert right array to compare with left array, i don’t make check brackets here {[(3+1)+2]+}
. And if reverse like now, then i fail to check here [1+1]+(2*2)-{3/3}
function brackets(expression){ let leftArr=[]; let rightArr = []; for(let i=0; i<expression.length; i++){ if(expression[i] === '(' || expression[i] === '[' || expression[i] === "{"){ leftArr.push(expression[i]); } if(expression[i] === ')'){ rightArr.push("("); }else if(expression[i] === '}'){ rightArr.push("{"); } else if(expression[i] === ']'){ rightArr.push("["); } } rightArr.reverse(); if(leftArr.length<rightArr.length || leftArr.length>rightArr.length){ return false; } for(let k=0; k<leftArr.length; k++) { if(leftArr[k] != rightArr[k]){ return false; } } return true; } console.log(brackets('(3+{1-1)}')); // false console.log(brackets('{[(3+1)+2]+}')); //true console.log(brackets('[1+1]+(2*2)-{3/3}')); //true console.log(brackets('(({[(((1)-2)+3)-3]/3}-3)')); //false
Advertisement
Answer
In the shortest possible, with comments for lines that are probably confusing for you.
function check(expr){ const holder = [] const openBrackets = ['(','{','['] const closedBrackets = [')','}',']'] for (let letter of expr) { // loop trought all letters of expr if(openBrackets.includes(letter)){ // if its oppening bracket holder.push(letter) }else if(closedBrackets.includes(letter)){ // if its closing const openPair = openBrackets[closedBrackets.indexOf(letter)] // find its pair if(holder[holder.length - 1] === openPair){ // check if that pair is the last element in the array holder.splice(-1,1) // if so, remove it }else{ // if its not holder.push(letter) break // exit loop } } } return (holder.length === 0) // return true if length is 0, otherwise false } check('[[{asd}]]') /// true