← Назад к вопросам

Как проверить, все ли скобки расположены правильно с точки зрения математических операций в массиве скобок?

2.0 Middle🔥 191 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Проверка корректности скобок в математических выражениях

Эта задача является классической задачей на алгоритмы и часто встречается в собеседованиях. Суть - проверить, правильно ли расположены открывающие и закрывающие скобки всех типов.

Основная идея: использование стека

Алгоритм основан на принципе стека (LIFO - Last In First Out):

function isValidBrackets(s) {
  const stack = [];
  const pairs = {
    ")": "(",
    "]": "[",
    "}": "{"
  };
  
  for (const char of s) {
    // Если открывающая скобка - добавляем в стек
    if (char === "(" || char === "[" || char === "{") {
      stack.push(char);
    } 
    // Если закрывающая скобка
    else if (char === ")" || char === "]" || char === "}") {
      // Если стек пуст - ошибка
      if (stack.length === 0) return false;
      // Проверяем, соответствует ли последняя открывающая
      if (stack[stack.length - 1] !== pairs[char]) {
        return false;
      }
      stack.pop();
    }
  }
  
  // Если стек не пуст - есть лишние открывающие скобки
  return stack.length === 0;
}

// Примеры использования
console.log(isValidBrackets("()"));           // true
console.log(isValidBrackets("()[]{}"));       // true
console.log(isValidBrackets("(]"));           // false
console.log(isValidBrackets("([{}])"));       // true
console.log(isValidBrackets("("));            // false

Для работы с массивом скобок

Если входные данные - это массив скобок (строк):

function checkBracketsArray(bracketsArray) {
  const stack = [];
  const pairs = {
    ")": "(",
    "]": "[",
    "}": "{"
  };
  
  for (const bracket of bracketsArray) {
    if (["(", "[", "{"].includes(bracket)) {
      stack.push(bracket);
    } else if ([")", "]", "}"].includes(bracket)) {
      if (stack.length === 0 || stack.pop() !== pairs[bracket]) {
        return false;
      }
    }
  }
  
  return stack.length === 0;
}

const brackets = ["(", "[", ")", "]"];
console.log(checkBracketsArray(brackets)); // true

Сложность и производительность

  • Временная сложность: O(n) - проходим по каждому символу один раз
  • Пространственная сложность: O(n) в худшем случае - стек может содержать все скобки
  • Оптимизация: можно проверить длину строки (если нечётная - false сразу)

Оптимизированная версия

function isValidBracketsOptimized(s) {
  // Быстрая проверка
  if (s.length % 2 !== 0) return false;
  
  const stack = [];
  const pairs = new Map([
    [")", "("],
    ["]", "["],
    ["}", "{"]
  ]);
  
  for (const char of s) {
    if (pairs.has(char)) {
      if (stack.pop() !== pairs.get(char)) return false;
    } else {
      stack.push(char);
    }
  }
  
  return stack.length === 0;
}

Почему это важно в React-приложениях

Эта задача часто встречается в реальных сценариях frontend-разработки: парсинг шаблонов, проверка синтаксиса компонентов, валидация выражений JSX. Знание стека и его применения критично для продвинутого разработчика.

Как проверить, все ли скобки расположены правильно с точки зрения математических операций в массиве скобок? | PrepBro