Программа курса:
Разбор задачи: Кратчайшее завершающее слово
Предложенный нами код решения:
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- Пошаговое разбор решения:
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}:- Все условия выполняются, и слово может быть результатом.
- Возврат результата
После завершения всех проверок функция возвращает найденное слово:
return result
Пример работы функции
Входные данные:
licensePlate = "1s3 PSt"
words = ["step", "steps", "stripe", "stepple"]
Процесс работы:
После обработки
licensePlate:license_letters = {'s': 2, 'p': 1, 't': 1}- Для каждого слова из списка:
"step": буквы совпадают, но не хватает однойs."steps": все буквы подходят, обновляем результат."stripe": не хватает однойs."stepple": не хватает однойs.
- Результат:
"steps".
Итоговый вывод:
"steps"
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии