Разбор задачи: Кратчайшее завершающее слово

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

def shortestCompletingWord(licensePlate: str, words: list[str]) -> str:
    """
    :param licensePlate: Строка, содержащая буквы, цифры и пробелы.
    :param words: Список строк, среди которых нужно найти подходящее слово.
    :return: Кратчайшее слово, которое содержит все буквы из licensePlate.
    """
    # Извлекаем буквы из licensePlate, игнорируя цифры и пробелы, приводим к нижнему регистру.
    license_letters = {}
    for char in licensePlate.lower():
        if char.isalpha():
            license_letters[char] = license_letters.get(char, 0) + 1

    # Поиск кратчайшего подходящего слова.
    result = None
    for word in words:
        word_letters = {}
        for char in word:  # Подсчет букв в текущем слове.
            word_letters[char] = word_letters.get(char, 0) + 1
        # Проверяем, содержит ли слово все буквы из licensePlate в нужном количестве.
        if all(word_letters.get(char, 0) >= count for char, count in license_letters.items()):
            if result is None or len(word) < len(result):  # Обновляем результат, если слово короче.
                result = word

    return result
  1. Пошаговое разбор решения:

2.1 Извлечение букв из licensePlate

license_letters = {}
for char in licensePlate.lower():
    if char.isalpha():
        license_letters[char] = license_letters.get(char, 0) + 1
  • Что делает этот код?
    • Преобразует licensePlate в нижний регистр с помощью lower() для игнорирования регистра букв.
    • Проходит по каждому символу char в строке licensePlate.
    • Если символ является буквой (isalpha()), он добавляется в словарь license_letters, где ключ — это буква, а значение — количество ее вхождений.
  • Пример: Если licensePlate = "1s3 PSt", то после выполнения этого цикла:

    license_letters = {'s': 2, 'p': 1, 't': 1}
    

2.2 Поиск подходящего слова

result = None
for word in words:
    word_letters = {}
    for char in word:
        word_letters[char] = word_letters.get(char, 0) + 1
  • Что делает этот код?
    • Перебирает каждое слово из списка words.
    • Для каждого слова подсчитывает количество букв в словаре word_letters.
  • Пример: Если word = "steps", то после выполнения:

    word_letters = {'s': 2, 't': 1, 'e': 1, 'p': 1}
    

2.3 Проверка на выполнение условий

if all(word_letters.get(char, 0) >= count for char, count in license_letters.items()):
    if result is None or len(word) < len(result):
        result = word
  • Что делает этот код?
    • Проверяет, содержит ли текущее слово все буквы из licensePlate в нужных количествах.
    • Для проверки используется all(), который возвращает True, если для каждой буквы:

      word_letters.get(char, 0) >= count
      

      Здесь get(char, 0) берёт количество буквы в текущем слове или возвращает 0, если буква отсутствует.

  • Если слово подходит, то оно сравнивается по длине с текущим результатом. Если оно короче, то результат обновляется.
  • Пример: Для license_letters = {'s': 2, 'p': 1, 't': 1} и word_letters = {'s': 2, 't': 1, 'e': 1, 'p': 1}:
    • Все условия выполняются, и слово может быть результатом.

  1. Возврат результата

После завершения всех проверок функция возвращает найденное слово:

return result

Пример работы функции

Входные данные:

licensePlate = "1s3 PSt"
words = ["step", "steps", "stripe", "stepple"]

Процесс работы:

  1. После обработки licensePlate:

    license_letters = {'s': 2, 'p': 1, 't': 1}
    
  2. Для каждого слова из списка:
    • "step": буквы совпадают, но не хватает одной s.
    • "steps": все буквы подходят, обновляем результат.
    • "stripe": не хватает одной s.
    • "stepple": не хватает одной s.
  3. Результат: "steps".

Итоговый вывод:

"steps"

 



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