public boolean isValid(String s) { if (s == null || s.length() == 0) { return true; } int ptr = 0; char[] map = new char[s.length()]; for (char ch : s.toCharArray()) { switch (ch) { case '(': case '{': case '[': map[ptr++] = ch; break; case ')': if (ptr == 0 || map[--ptr] != '(') return false; break; case '}': if (ptr == 0 || map[--ptr] != '{') return false; break; case ']': if (ptr == 0 || map[--ptr] != '[') return false; break; } } return ptr == 0; }
Эта проблема может быть решена с помощью стека. Решение, предоставляемое LeetCode, использует класс Stack
. Однако это может быть смоделировано с помощью массива. Сначала мы создаем пустой массив map
, который имеет тот же размер, что и строка s
. Затем мы перебираем каждый символ s
и когда мы сталкиваемся с левой круглой скобкой, мы сохраняем круглую скобку в map
в индексе ptr
. Кроме того, мы увеличиваем ptr
на единицу. (аналогично push
in Stack
). Если мы сталкиваемся с правой круглой скобкой, мы проверяем, есть ли у правой круглой скобки соответствующая левая скобка, хранящаяся в ptr -1
в карте
. Если нет, верните |/false . Наконец, мы проверяем, равен ли
ptr 0 (аналогично пустому
стеку ).
Временная сложность : O(n)
Дополнительное пространство : O(n)
Оригинал: “https://dev.to/algobot76/leetcode-20-valid-parentheses-1274”