Рубрики
Без рубрики

Проблема с кодом файла: Допустимая скобка

Допустимая скобка. С тегами java, leetcode, программирование.

программирование-упражнения (Серия из 5 частей)

Фон

Недавно я решил решить некоторые проблемы в leetcode.com для развлечения и практики моей java, которой я давно не пользовался. Я решил документировать свой мыслительный процесс по мере решения этих проблем. Вы можете найти некоторые другие решения в таблице серий над этим разделом.

Проблема

Допустимые круглые скобки Учитывая строку скобок, определите, является ли строка допустимой. Строка допустима тогда и только тогда, когда открывающая и закрывающая скобки совпадают.

Например, для

{([])} - valid
{{{ - Invalid
()() - Valid
({) - Invalid

Решение

Я знаю ответ на эту проблему из моего вступительного курса в колледже по алгоритмам. Хитрость здесь в том, чтобы использовать структуру данных Stack . Одним из первых преимуществ, которые я помню о стеках, было использование стеков для проверки определенных видов грамматики, о чем и идет речь в этом вопросе. Проверка грамматики скобок.

Псевдоалгоритм заключается в:

  1. Пройдитесь по каждому символу в массиве.
  2. Если символ представляет собой открывающие скобки, вставьте их в массив.
  3. Если символ представляет собой закрывающие скобки, вставьте верхний элемент в массив.
  4. Если это соответствующие открывающие скобки, двигайтесь дальше; в противном случае верните false (быстро терпит неудачу)
  5. Если все элементы были обработаны, то строка допустима, если стек пуст.

Кодирование решения

Ниже приведена первая версия решения, которое я написал:

После того, как я убедился, что это работает, я хотел немного прибраться. Легкой победой было бы перевернуть внутреннюю если цикл, так что мне не нужно хранить две карты. Также это позаботится о недопустимых символах (без скобок). Так я попал сюда:

Боковая панель

Еще одно отличие в двух приведенных выше решениях заключается в том, что во втором случае у меня есть особый случай для пустой строки. Причина этого двоякая:

  1. Во-первых, конечно, рано потерпеть неудачу. Не нужно пытаться работать со строкой, когда мы уже знаем результат.
  2. Во-вторых, это то, что я узнал сегодня (#до). В java, если вы разделяете пустую строку на пустую строку, это приводит к массиву длины 1 с пустой строкой в качестве единственного элемента. 😮

Вот, например,

jshell> "".split("")
$1 ==> String[1] { "" }

программирование-упражнения (Серия из 5 частей)

Оригинал: “https://dev.to/deepakvenkat/leetcode-problem-valid-parenthesis-3e41”