Разбор задачи: Записка о выкупе

Предложенный нами код решения:

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. Для каждого символа проверяется:

  1. Есть ли этот символ в словаре magazine_counter.
  2. Осталось ли достаточно символов для использования (значение в словаре больше 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":

  1. Сначала проверяется символ 'a'. Он есть в словаре ({'a': 2, 'b': 1}), значение уменьшается до 1.
  2. Второй 'a' также есть, значение уменьшается до 0.
  3. Все символы строки 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

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии