Стек хранит ожидаемые закрывающие скобки. При закрывающей проверьте вершину, остальные символы игнорируйте; в конце стек должен быть пуст.
Проверка корректности вложенных скобок в строке
Стек хранит ожидаемые закрывающие скобки. При закрывающей проверьте вершину, остальные символы игнорируйте; в конце стек должен быть пуст.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В заданной строке могут встречаться три типа скобок: круглые (), фигурные {} и квадратные []. Необходимо выяснить, правильно ли они расположены: каждая открывающая скобка должна быть закрыта одинаковой закрывающей скобкой и в корректном порядке.
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(глубины). Кавычки и комментарии не обрабатываются как синтаксис языка: скобки внутри них тоже учитываются.