Анаграмма — это как два набора магнитиков-букв на холодильнике. Если у вас и у соседа одинаковый набор магнитиков (та же буква «к», та же «о», та же «т»), вы оба сможете выложить слово «кот» или «ток» — порядок разный, а буквы те же. А вот если у соседа лишний магнитик «и», набор уже другой, и «котик» из ваших букв не сложить.
Чтобы проверить «одинаковые ли наборы», достаточно пересчитать, сколько каких магнитиков у каждого. Это и есть «словарьКоллекция пар «ключ → значение»: {"a": 1}. Быстрый доступ по ключу. По-английски dict. частот».
Условие
Даны две строкиТекстовое значение в кавычках: "привет". Неизменяема. По-английски string (str).s и t. Вернуть True, если t — анаграмма s (состоит из тех же букв в том же количестве, но в другом порядке).
Пример: s = "листва", t = "вислат" → True.
Идея
Анаграммы имеют одинаковый набор букв с одинаковыми частотами. Достаточно сравнить «словари частот» обеих строк. Если у строк разная длина — сразу False.
▶ anagram.py
Разбираем код по частям
if len(s) != len(t): return False — быстрая отбраковка: разное число букв — точно не анаграмма.
count = {} — словарь «буква → сколько раз встретилась».
count[ch] = count.get(ch, 0) + 1 — .get(ch, 0) возвращает текущий счётчик буквы или 0, если её ещё не было. Прибавляем 1 — так копим частоты для строки s.
Второй циклКонструкция, повторяющая блок кода: for перебирает элементы, while — пока условие истинно. идёт по t и вычитает: каждая буква из t должна «погасить» одну такую же из счётчика.
if ch not in count или count[ch] < 0 — значит, в t буква, которой в s не было или было меньше → не анаграмма.
📝Заметка
Есть короткий способ: return sorted(s) == sorted(t). Он проще, но медленнее — O(n log n) против O(n) у решения со словарём. На собеседовании стоит знать оба и уметь объяснить разницу.
💡Совет
🔮 Предскажите вывод
Что выведет следующая ячейка для пары "aabb" и "bbaa"? А для "abc" и "abd"? Подумайте про наборы букв, прежде чем запускать.
▶ predict-anagram.py
Первый вызов — True: sorted("aabb") и sorted("bbaa") дают один и тот же списокИзменяемая упорядоченная коллекция элементов: [1, 2, 3]. По-английски list.['a','a','b','b']. Второй — False: у первой строки есть c, у второй — d, отсортированные списки различаются.
⚠️ Частые ошибки новичков
Частая ошибка — обращаться к ключу словаря, которого ещё нет, через count[ch] вместо count.get(ch, 0). Это вызывает KeyError. Запустите сломанный код, прочитайте ошибку и почините: используйте .get(ch, 0).
▶ broken-anagram.py
Заданиелёгкаярешение.py
Напишите is_anagram(s, t), возвращающую True, если строки — анаграммы. Подсказка: можно сравнить отсортированные строки или словари частот.
Заданиелёгкаярешение.py
Дополнительное упражнение. Напишите first_unique_char(s), которая возвращает первую букву, встречающуюся в строке ровно один раз (или пустую строку, если такой нет). Используйте словарь частот.
❓Проверь себя
Зачем в начале проверять len(s) != len(t)?
В чём разница между sorted(s)==sorted(t) и подсчётом частот?
ℹ️Важно
✅ Что вы узнали
Анаграммы — это одинаковый набор букв с одинаковыми частотами.
dict.get(ch, 0) — безопасный способ читать счётчик, которого может ещё не быть.
Подсчёт частот через словарь даёт O(n); сортировка — короче, но O(n log n).
Комментарии
Загрузка…
Загрузка комментариев…