Всем привет,

Это ДЕНЬ 3 решения проблем с JavaScript.

Сегодня я собираюсь объяснить решение Проблемы допустимых скобок в LeetCode.

Что такое проблема с допустимыми скобками?

Учитывая строку s, содержащую только символы '(', ')', '{', '}', '[' и ']', определите, допустима ли входная строка.

Введенная строка считается допустимой, только если выполняются следующие условия:

  1. Открытые скобки должны быть закрыты однотипными скобками. Например: '(' эту скобку может закрыть только ')', а не остальные.
  2. Открытые скобки должны быть закрыты в правильном порядке. Например — '(' за этой скобкой должно следовать ')' и не может быть '}' /']' в качестве следующего символа.
  3. Каждой закрывающей скобке соответствует открытая скобка того же типа.

Пример логики:

Input: s = "()[]"
Output: Valid

Input: s = "([)]"
Output: Invalid

Как решить

Задача состоит в том, чтобы найти набор условий, чтобы сделать строку действительной или недействительной.

Решение

Ссылка на репозиторий GitHub — https://github.com/Starboy369/JSProblemSolving (Отметьте мой репозиторий звездочкой, чтобы найти все решения на JavaScript)

Фрагмент кода

var brackets = {
    "{":"}",
      "[":"]",
      "(":")"
  }
  var isValid = function(s) {
  if(s.length %2 != 0)return false
  
  if(s[s.length -1] === '{' || s[s.length -1] === '[' || s[s.length -1] === "(") return false 
  
  if(s[0] === "]" || s[0] === ")" || s[0] === "}") return false
  
  
  var arr = []
  
  for(var i=0;i<s.length;i++){
    if(s[i] === "(" || s[i] === "{" || s[i] === "["){
  arr.push(s[i])
    }else if(brackets[arr.pop()] !== s[i]){
      return false
    }
  }
  
  return arr.length === 0
  };

Пояснение

  1. Мы создаем объект (здесь — скобки), чтобы сравнить, следует ли за открывающей парой закрывающая пара.
  2. Мы можем быстро сократить действительность, используя следующие условия:

Условия:

  • Если длина строки является НЕЧЕТНЫМ числом, строка может считаться Недействительно. Потому что допустимая строка будет состоять из пары или четного числа символов.
  • Если начальный символ строки является закрывающей скобкой, мы можем заключить, что строка Недействительно.
  • Точно так же, если конечный символ строки является открывающей квадратной скобкой, мы можем заключить, что строка >Недействительно.

Пояснение кода

Мы создали стек с именем arr. И у нас есть цикл, который проверяет, соответствует ли строка условию. Если это так, он помещается внутрь стека.

Мы проверяем это с помощью - "brackets[arr.pop()] !== s[i]"

В следующем цикле, поскольку в стеке есть только один элемент, если мы извлекаем его, он возвращает элемент. Затем мы сопоставляем его с текущей строкой, чтобы проверить скобки.

Заключение

Таким образом, мы можем решить эту проблему, используя стек.

И, как обычно, дайте мне знать, если есть лучший подход к решению этой проблемы. Рад учиться у всех вас!

Я буду каждый день публиковать блоги с проблемами, решенными в JavaScript. Следуйте за мной, чтобы никогда не пропустить решение.

Удачного кодирования на JavaScript!!!