20. Valid Parentheses

20. Valid Parentheses

Условия задачи

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

Входная строка допустима, если:

Открытые скобки должны быть закрыты скобками того же типа.
Открытые скобки должны быть закрыты в правильном порядке.
Каждой закрывающей скобке соответствует открытая скобка того же типа.

Примеры

Example 1:

Input: s = «()»

Output: true

Example 2:

Input: s = «()[]{}»

Output: true

Example 3:

Input: s = «(]»

Output: false

Example 4:

Input: s = «([])»

Output: true

Ограничения

Constraints:

  • 1 <= s.length <= 104
  • s consists of parentheses only '()[]{}'.

Рассуждение

Первое что приходит в голову это посчитать количество открывающихся и закрывающихся скобок с учетом 3х видов скобок:

  1. Фигурных {}
  2. Квадрaтных []
  3. Круглых ()
public static boolean isValid(String s) throws UnexpectedException {
        // Если у нас пустая строка, то принимаем её за валидную
        if (s.isEmpty()) return true;

        // Число символов в строке должно быть четным, так как у каждой скобки должна быть парная ей закрывающаяся скобка
        if (s.length() % 2 == 1) return false;

        // a - (, aa - ), b = [, bb - ], c - {, cc - }
        int a = 0, aa = 0, b = 0, bb = 0, c = 0, cc = 0;
        for (int i = 0; i < s.length(); i++) {
            switch (s.charAt(i)) {
                case '{':
                    c++;
                    break;
                case '}':
                    cc++;
                    break;
                case '[':
                    b++;
                    break;
                case ']':
                    bb++;
                    break;
                case '(':
                    a++;
                    break;
                case ')':
                    aa++;
                    break;
                default:
                // по условию методам валидации на LeetCode эту строчку нуэно заменить на
                // return false; // а так же убрать UnexpectedException в сигнатуре метода
                    throw new UnexpectedException("Invalid character '" + s.charAt(i) + "'");
            }
        }

        // Краткая форма записи проверки что количество открывающихся и закрывающиъся скобок попарно равно с учетом их вида
        return a == aa && b == bb && c == cc;
    }

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

Что за правильный порядок?

  1. Каждая открывающая скобка должна иметь соответствующую закрывающую
  2. Скобки должны быть закрыты в обратном порядке, в котором они были открыты (принцип «стековой» структуры).

Теперь мы понимаем, что:

({[]}) — правильно
([)] — неправильно (нарушен порядок)

А так же в самом определении этого правильного порядка есть подсказка, которая нам помогает понять, что нужно использовать именно стек в качестве структуры данных.

Решение

Практическое применение

Собственная реализация синтаксического анализатора, популярная задача с собеседования

Оцените автора
Kosenkov.Pro
Добавить комментарий