Как обработать несоответствие длины шаблона и количества слов?
Что проверяют
Обычно это уточнение к задаче Word Pattern: даны шаблон abba и строка dog cat cat dog, нужно понять, отображаются ли буквы на слова взаимно однозначно. Интервьюер смотрит, заметите ли вы граничный случай до основного цикла. Следом спрашивают про сложность и про то, почему одного словаря мало.
Как отвечать
Разбейте строку через s.split() без аргументов: он делит по любым пробельным символам и не оставляет пустых элементов. Сразу после этого сравните длины. Если букв и слов разное количество, взаимно однозначного соответствия не существует, и функция возвращает False без дальнейшей работы.
Проверка обязательна, а не косметическая: zip молча обрезает по короткой последовательности, и пара abba и dog cat cat без неё пройдёт как верная. С Python 3.10 можно писать zip(pattern, words, strict=True), тогда разная длина вызовет ValueError, но здесь явное сравнение читается проще.
Дальше два словаря: буква в слово и слово в букву.
def word_pattern(pattern: str, s: str) -> bool:
words = s.split()
if len(pattern) != len(words):
return False
to_word, to_char = {}, {}
for ch, w in zip(pattern, words):
if to_word.setdefault(ch, w) != w or to_char.setdefault(w, ch) != ch:
return False
return TrueВремя O(n), память O(n). Если вопрос про подстановку слов в шаблон с {}, принцип тот же: проверить количество до форматирования и выбросить ValueError с понятным сообщением, раз речь о нарушении контракта, а не о штатном ответе «нет».
Где спотыкаются
Пропускают сравнение длин и полагаются на zip. Код проходит примеры из условия и падает на скрытых тестах.
Делят через s.split(' '). На двойном пробеле появляется пустое слово, и длины расходятся там, где не должны.
Держат только словарь «буква в слово». Тогда abba и dog dog dog dog проходит, потому что никто не проверил, что a и b не указывают на одно слово.