Прямо сейчас вы получаете каждую открытую скобку в один массив, затем вставляете открытую скобку для каждой закрывающей скобки в другой массив, а затем сравниваете их.Это немного расточительно.
Вместо этого вы можете поддерживать стек.Поместите открытый тег в стек, и если вы обнаружите закрывающую скобку - выскочите из стека
- , если в стеке нет совпадений или ничего нет, завершите с ошибкой
- если вы закончите с размером стека, равным нулю, вы добьетесь успеха
function brackets(expression) {
let stack = [];
let current;
const matchLookup = {
"(": ")",
"[": "]",
"{": "}",
};
for (let i = 0; i < expression.length; i++) {
current = expression[i]; //easier than writing it over and over
if (current === '(' || current === '[' || current === "{") {
stack.push(current);
} else if (current === ')' || current === ']' || current === "}") {
const lastBracket = stack.pop();
if (matchLookup[lastBracket] !== current) { //if the stack is empty, .pop() returns undefined, so this expression is still correct
return false; //terminate immediately - no need to continue scanning the string
}
}
}
return stack.length === 0; //any elements mean brackets left open
}
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
Я использовал объект для поиска значений, но он не обязательно должен быть одним.Альтернативой является использование двух массивов, которые необходимо синхронизировать
opening = ["(", "[", "{"]
closing = [")", "]", "}"]
С другой стороны, если они у вас есть, вы можете сократить свои if
чеки до if (open.includes(current))
и if (closing.includes(current))
.