Проверка корректности вложенных скобок в строке

Стек хранит ожидаемые закрывающие скобки. При закрывающей проверьте вершину, остальные символы игнорируйте; в конце стек должен быть пуст.

Короткий ответ

Что ответить на собеседовании

Стек хранит ожидаемые закрывающие скобки. При закрывающей проверьте вершину, остальные символы игнорируйте; в конце стек должен быть пуст.

Подробный разбор

Ответ с пояснениями

Условие

В заданной строке могут встречаться три типа скобок: круглые (), фигурные {} и квадратные []. Необходимо выяснить, правильно ли они расположены: каждая открывающая скобка должна быть закрыта одинаковой закрывающей скобкой и в корректном порядке.

input := "asdasd (asdasd) asd{}asdasd[]"

Ответ

Стек хранит ожидаемые закрывающие скобки. При закрывающей проверьте вершину, остальные символы игнорируйте; в конце стек должен быть пуст.

Реализация:

func balanced(s string) bool {
    stack := make([]rune, 0)
    for _, ch := range s {
        switch ch {
        case '(':
            stack = append(stack, ')')
        case '[':
            stack = append(stack, ']')
        case '{':
            stack = append(stack, '}')
        case ')', ']', '}':
            if len(stack) == 0 || stack[len(stack)-1] != ch {
                return false
            }
            stack = stack[:len(stack)-1]
        }
    }
    return len(stack) == 0
}

Пример из условия даёт true, а ([)] — false: важен порядок вложенности, не только количество скобок. Время O(n), память O(глубины). Кавычки и комментарии не обрабатываются как синтаксис языка: скобки внутри них тоже учитываются.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

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

Подробнее