Программа курса:
Разбор задачи: Записка о выкупе
Предложенный нами код решения:
def can_construct(ransomNote, magazine):
"""
:param ransomNote: строка, которую нужно составить
:param magazine: строка, из которой берутся буквы
:return: True, если составление возможно, иначе False
"""
# Подсчёт символов в magazine
magazine_counter = {}
for char in magazine:
if char in magazine_counter:
magazine_counter[char] += 1
else:
magazine_counter[char] = 1
# Проверка возможности составления ransomNote
for char in ransomNote:
if char not in magazine_counter or magazine_counter[char] == 0:
return False
magazine_counter[char] -= 1
return True
Функция can_construct проверяет, можно ли составить строку ransomNote из символов строки magazine. Вот подробное объяснение шагов:
1. Подсчёт символов в magazine
Сначала создаётся словарь magazine_counter, чтобы подсчитать количество вхождений каждого символа в строке magazine.
Код:
magazine_counter = {}
for char in magazine:
if char in magazine_counter:
magazine_counter[char] += 1
else:
magazine_counter[char] = 1
Разбор:
- Цель: Учёт количества каждого символа в строке
magazine. - Если символ уже присутствует в словаре, его значение увеличивается на 1.
- Если символ встречается впервые, создаётся новая запись с начальным значением 1.
Пример:
Для строки "aab" словарь будет:
{'a': 2, 'b': 1}
2. Проверка возможности составления ransomNote
Проход по символам строки ransomNote. Для каждого символа проверяется:
- Есть ли этот символ в словаре
magazine_counter. - Осталось ли достаточно символов для использования (значение в словаре больше 0).
Код:
for char in ransomNote:
if char not in magazine_counter or magazine_counter[char] == 0:
return False
magazine_counter[char] -= 1
Разбор:
- Если символ отсутствует в словаре или его значение равно 0, возвращается
False, потому что составление невозможно. - Если символ есть и его значение больше 0, значение уменьшается на 1, чтобы отразить "использование" символа.
Пример:
Для ransomNote = "aa" и magazine = "aab":
- Сначала проверяется символ
'a'. Он есть в словаре ({'a': 2, 'b': 1}), значение уменьшается до 1. - Второй
'a'также есть, значение уменьшается до 0. - Все символы строки
ransomNoteпроверены, возвращаетсяTrue.
3. Итоговое значение
Если цикл по символам ransomNote завершён без возврата False, значит, строку можно составить, и функция возвращает True.
Альтернативы
Можно было бы использовать встроенные методы Python, такие как collections.Counter, но решение с использованием словаря явно показывает, как работает подсчёт и проверка символов.
Пример использования
print(can_construct("aa", "aab")) # True
print(can_construct("aa", "ab")) # False
print(can_construct("a", "b")) # False
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии