Ctrl K

Фраза из начал слов: длинная версия

Сложная
Дан словарь dictionary и строка phrase. Кусок — это любая непустая строка, которая является началом (префиксом) хотя бы одного слова из словаря; целое слово тоже подходит. Склейте phrase из кусков, взяв их как можно меньше (один и тот же кусок можно брать сколько угодно раз). Верните минимальное число кусков или -1, если собрать phrase невозможно. Строки здесь длинные, поэтому перебор всех кусков в каждой позиции не уложится во время.
Пример 1
dictionary=['sunrise', 'setting', 'tide'], phrase='sunset' → 2

«sun» — начало слова «sunrise», «set» — начало слова «setting». Двух кусков достаточно, а одним «sunset» не собрать.

Пример 2
dictionary=['abab', 'b'], phrase='ababbaba' → 3

Например, «abab» + «b» + «aba»: последний кусок — начало слова «abab». Меньше чем за три куска не выйдет.

Пример 3
dictionary=['moon'], phrase='noon' → -1

Ни одно слово не начинается с буквы «n».

Ограничения
  • 1 ≤ len(dictionary) ≤ 100
  • 1 ≤ len(dictionary[i]) ≤ 5·10⁴
  • Суммарная длина слов словаря не больше 10⁵
  • 1 ≤ len(phrase) ≤ 5·10⁴
  • Все строки состоят из строчных латинских букв
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиЦель из начал слов СредняяХвосты, повторяющие начало СложнаяСнимаем повторяющееся начало СложнаяСлово рядом с якорем СложнаяСлова-рамки Сложная
загружаем Python…
Вход
dictionary=['sunrise', 'setting', 'tide'], phrase='sunset'
Ожидается
2

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 172 теста на сервере, включая скрытые.