Недавно я связался с этой интересной проблемой. Вам предоставляется строка, содержащая только символы '('
, ')'
, '{'
, '}'
, '['
и ']'
, например, "[{()}]"
, вам нужно написать функцию, которая проверяет правильность такой входной строки, функция может быть такой:
bool isValid(char* s);
эти скобки должны быть закрыты в правильном порядке, например "()"
и "()[]{}"
являются действительными, но "(]"
, "([)]"
и "{{{{"
не являются!
Я вышел со следующим решением O (n) и O (n) пространственной сложности, которое отлично работает:
- Поддерживать стек символов.
- Всякий раз, когда вы обнаруживаете открывающиеся фигурные скобки
'('
,'{'
ИЛИ'['
, надавите на стек. - Всякий раз, когда вы обнаруживаете закрывающие фигурные скобки
')'
,'}'
ИЛИ']'
, проверьте, соответствует ли верхняя часть стека соответствующей открывающей скобке, если да, затем поместите стек, иначе сломайте цикл и верните false. - Повторите шаги 2 - 3 до конца строки.
Это работает, но мы можем оптимизировать его для пространства, может быть постоянным дополнительным пространством, я понимаю, что временная сложность не может быть меньше O (n), поскольку мы должны смотреть на каждый символ.
Итак, мой вопрос: мы можем решить эту проблему в O (1) пространстве?