Алгоритм проверки скобок корректен для строк из скобок; ошибка находится в тесте: для «{[]}» ожидается True, а не False. Поэтому последний assert падает.
import unittest
Алгоритм проверки скобок корректен для строк из скобок; ошибка находится в тесте: для «{[]}» ожидается True, а не False. Поэтому последний assert падает.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
import unittest class Solution: def isvalid(self, s:str) -> bool: matching_brackets = { ")": "(", "]": "[", "}": "{", }
stack: list[str] = []
for bracket in s:
if bracket in "([{":
stack.append(bracket)
continue
if bracket not in matching_brackets:
return False
if not stack or stack[-1] != matching_brackets[bracket]:
return False
stack.pop()
return not stack
class SolutionTest: def init(self): self.Solution = Solution()
def run(self):
test_cases = [
("", True),
("()", True),
("(){}[]", True),
("(({}))", True),
("(", False),
(")", False),
("(((", False),
("{[]}", False),
]
for brackets, expected in test_cases:
actual = self.Solution.isvalid(brackets)
assert actual == expected, (
f"Ошибка для {brackets!r}"
f"Хотели получить {expected}, а получили {actual}"
)
print(f"Все тесты пройдены: {len(test_cases)}")
if name == "main": SolutionTest().run()
Ответ
Алгоритм проверки скобок корректен для строк из скобок; ошибка находится в тесте: для «{[]}» ожидается True, а не False. Поэтому последний assert падает.
Стек хранит открывающие скобки, а закрывающая обязана соответствовать вершине. После обхода стек должен быть пустым. Время O(n), память O(n). Исправьте тест на ('{[]}', True) и добавьте неверные случаи вроде '([)]' и '{[}'. Импорт unittest здесь не используется: SolutionTest — собственный runner, а не наследник unittest.TestCase.