Задача про скобки.

Супер распространенная задача со скрининг-собеседований, которую я встречала уже не раз.

На вход подается строка, состоящая из круглых скобок. Выведите True, если скобки вложены правильно и False, если нет.

Например, если входная строка (()()(())), то ответ должен быть True.

А если ()), то False.

Это базовая задача на алгоритмы и решается она за один проход по строке (O(n)). Идея здесь следующая: нужно завести переменную-стек, которая будет хранить состояние скобки на i-том шаге и в зависимости от состояния принимать решение о том, валидная строка или нет.

Вот видео с более подробным описанием решения.

Я видела варианты, в которых люди пишут свой класс для стеэка, но в качестве стека сработает и обычный список, если использовать только методы append() и pop().

Вот возможное решение, которое мне нравится:

 if_balanced(string):

stack = []

for i in string:

if i == "(":

stack.append(i)

elif i == ")":

if len(stack) == 0:

return False

stack.pop()

if stack:

return False

return True

print(if_balanced("()()())"))

Усложненная форма этой же задачи: на вход подаются строка со скобками разных видов, например, ([]{}) -> True, ({}([]{)}) -> False.

Можете решить ее самостоятельно. 🐠

February 12, 2021
9 comments
Alexander Lesnyakov 
Ваше решение работает неверно
Да, вы правы. Спасибо.
Не учитываю порядок, кейс ")(" проходит как верный.
Нужно выходить с False если достигли 0:
def if_balanced(string):
result = 0
for i in string:
if i == "(":
result += 1
elif i == ")":
if result == 0:
return False
result -= 1
return result == 0
Alexander Lesnyakov 
Stanislav Rogozhin  Кажется, нужно сразу выходить с false, если result становится отрицательным
Да, вы правы. Протестировал код - нужно выходить если достигли 0.
Avatar
Евгений 
с разными скобками такое не проканает, тут без стека не обойтись
Alexander 
Можно так же решить и с разными скобками.
Надо ввести две переменные и проверять на входдение

left_brackets = '({['
right_brackets = ')}]'

И проверка

if I in left_brackets
...
elif i in right_brackets
...
after ad 
Такой вариант возможен?

https://pastebin.com/fDNa9VNX
Do you want to add a new comment?