← Назад к вопросам

Анонимное письмо из журнала

2.0 Middle🔥 181 комментариев
#Python Core

Условие

Даны два текста: текст письма и текст журнала. Определите, можно ли составить письмо, используя только символы из журнала (каждый символ можно использовать только один раз).

Пример

can_compose("hello", "ehllo world") → True can_compose("hello", "world") → False

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Анонимное письмо из журнала

Описание

Эта задача проверяет, можно ли составить письмо, используя символы из журнала. Каждый символ из журнала можно использовать только один раз. Это требует подсчёта частоты символов в обоих строках и сравнения их.

Решение 1: С использованием Counter из collections

from collections import Counter

def can_compose(letter, magazine):
    letter_count = Counter(letter)
    magazine_count = Counter(magazine)
    
    for char, count in letter_count.items():
        if magazine_count[char] < count:
            return False
    
    return True

print(can_compose("hello", "ehllo world"))  # True
print(can_compose("hello", "world"))         # False

Решение 2: Компактный способ с Counter

from collections import Counter

def can_compose(letter, magazine):
    return not (Counter(letter) - Counter(magazine))

print(can_compose("hello", "ehllo world"))  # True
print(can_compose("hello", "world"))         # False

Решение 3: Ручной подсчёт через словарь

def can_compose(letter, magazine):
    if len(letter) > len(magazine):
        return False
    
    char_count = {}
    
    for char in magazine:
        char_count[char] = char_count.get(char, 0) + 1
    
    for char in letter:
        if char not in char_count or char_count[char] == 0:
            return False
        char_count[char] -= 1
    
    return True

print(can_compose("hello", "ehllo world"))  # True
print(can_compose("hello", "world"))         # False

Решение 4: С использованием defaultdict

from collections import defaultdict

def can_compose(letter, magazine):
    char_count = defaultdict(int)
    
    for char in magazine:
        char_count[char] += 1
    
    for char in letter:
        if char_count[char] <= 0:
            return False
        char_count[char] -= 1
    
    return True

Решение 5: Оптимизация по памяти для ASCII

def can_compose(letter, magazine):
    if len(letter) > len(magazine):
        return False
    
    char_count = [0] * 256
    
    for char in magazine:
        char_count[ord(char)] += 1
    
    for char in letter:
        if char_count[ord(char)] == 0:
            return False
        char_count[ord(char)] -= 1
    
    return True

Тестирование

def test_can_compose():
    assert can_compose("hello", "ehllo world") == True
    assert can_compose("hello", "world") == False
    assert can_compose("a", "b") == False
    assert can_compose("", "anything") == True
    assert can_compose("abc", "abc") == True
    assert can_compose("aab", "ab") == False
    assert can_compose("aab", "baa") == True
    assert can_compose("aa", "ab") == False
    assert can_compose("aa", "aab") == True
    print("All tests passed!")

test_can_compose()

Рекомендуемое решение для интервью

from collections import Counter

def can_compose(letter: str, magazine: str) -> bool:
    return not (Counter(letter) - Counter(magazine))

Это решение является самым элегантным и питоническим. Оно использует встроенные возможности Python и демонстрирует хорошее понимание библиотеки collections. Альтернативное решение с ручным подсчётом тоже приемлемо и показывает понимание алгоритма.

Анонимное письмо из журнала | PrepBro