Ctrl K

Самая дешёвая сборка строки

Сложная
Нужно напечатать строку phrase, приписывая к изначально пустой строке готовые куски. Кусок pieces[i] стоит prices[i], и каждый кусок можно использовать сколько угодно раз (или ни разу). Добавлять кусок можно только в конец уже напечатанного. Верните наименьшую суммарную стоимость, за которую получается ровно phrase. Если собрать phrase нельзя, верните -1.
Пример 1
phrase='moonlight', pieces=['moon', 'light', 'moonl', 'ight', 'mo', 'on'], prices=[8, 5, 3, 4, 2, 2] → 7

moonl + ight стоит 3 + 4 = 7. Вариант mo + on + light стоит 9, а moon + light — 13.

Пример 2
phrase='abab', pieces=['ab', 'b', 'aba'], prices=[3, 1, 1] → 2

Подходят ab + ab (6) и aba + b (2) — берём дешёвый вариант. Один и тот же кусок можно брать несколько раз.

Пример 3
phrase='xyz', pieces=['xy', 'yz'], prices=[1, 1] → -1
Ограничения
  • 1 ≤ len(phrase) ≤ 5·10⁴
  • 1 ≤ len(pieces) = len(prices) ≤ 5·10⁴
  • 1 ≤ len(pieces[i]) ≤ len(phrase)
  • Суммарная длина всех кусков не больше 5·10⁴
  • phrase и куски состоят из строчных латинских букв
  • 1 ≤ prices[i] ≤ 10⁴
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиВсе способы расставить пробелы СложнаяСлова из других слов СложнаяЧисла с рабочих клавиш СложнаяСклейка фрагментов СложнаяВырезать столбцы ради порядка в строках Сложная
загружаем Python…
Вход
phrase='moonlight', pieces=['moon', 'light', 'moonl', 'ight', 'mo', 'on'], prices=[8, 5, 3, 4, 2, 2]
Ожидается
7

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