Всем привет,
Это ДЕНЬ 3 решения проблем с JavaScript.
Сегодня я собираюсь объяснить решение Проблемы допустимых скобок в LeetCode.
Что такое проблема с допустимыми скобками?
Учитывая строку s
, содержащую только символы '('
, ')'
, '{'
, '}'
, '['
и ']'
, определите, допустима ли входная строка.
Введенная строка считается допустимой, только если выполняются следующие условия:
- Открытые скобки должны быть закрыты однотипными скобками. Например:
'('
эту скобку может закрыть только')'
, а не остальные. - Открытые скобки должны быть закрыты в правильном порядке. Например —
'('
за этой скобкой должно следовать')'
и не может быть'}'
/']'
в качестве следующего символа. - Каждой закрывающей скобке соответствует открытая скобка того же типа.
Пример логики:
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 };
Пояснение
- Мы создаем объект (здесь — скобки), чтобы сравнить, следует ли за открывающей парой закрывающая пара.
- Мы можем быстро сократить действительность, используя следующие условия:
Условия:
- Если длина строки является НЕЧЕТНЫМ числом, строка может считаться Недействительно. Потому что допустимая строка будет состоять из пары или четного числа символов.
- Если начальный символ строки является закрывающей скобкой, мы можем заключить, что строка Недействительно.
- Точно так же, если конечный символ строки является открывающей квадратной скобкой, мы можем заключить, что строка >Недействительно.
Пояснение кода
Мы создали стек с именем arr. И у нас есть цикл, который проверяет, соответствует ли строка условию. Если это так, он помещается внутрь стека.
Мы проверяем это с помощью - "brackets[arr.pop()] !== s[i]"
В следующем цикле, поскольку в стеке есть только один элемент, если мы извлекаем его, он возвращает элемент. Затем мы сопоставляем его с текущей строкой, чтобы проверить скобки.
Заключение
Таким образом, мы можем решить эту проблему, используя стек.
И, как обычно, дайте мне знать, если есть лучший подход к решению этой проблемы. Рад учиться у всех вас!
Я буду каждый день публиковать блоги с проблемами, решенными в JavaScript. Следуйте за мной, чтобы никогда не пропустить решение.
Удачного кодирования на JavaScript!!!