Ctrl K

Правила переписывания фраз

Сложная
Редактор умеет заменять фрагменты текста по правилам: правило i превращает подстроку rule_from[i] в rule_to[i] (той же длины) и стоит rule_cost[i]. Одно и то же правило можно применять сколько угодно раз; одинаковые пары с разной ценой тоже возможны. Нужно превратить строку start в строку goal той же длины. Каждая замена применяется к какому-то участку текущей строки. Любые два применённых участка должны либо не пересекаться вовсе, либо совпадать полностью — то есть один и тот же участок можно переписывать несколько раз подряд, а частично перекрывающиеся участки запрещены. Верните наименьшую суммарную стоимость превращения или -1, если это невозможно.
Пример 1
start="cat", goal="cot", rule_from=["a", "e"], rule_to=["e", "o"], rule_cost=[2, 3] → 5

Прямого правила a → o нет, но букву можно переписать дважды на одном месте: a → e за 2, затем e → o за 3. Итого 5.

Пример 2
start="abcd", goal="xycd", rule_from=["ab", "a", "b"], rule_to=["xy", "x", "y"], rule_cost=[5, 1, 1] → 2

Выгоднее заменить буквы по отдельности: a → x и b → y за 1 + 1 = 2, чем фрагмент ab целиком за 5.

Пример 3
start="aaa", goal="bbb", rule_from=["aa"], rule_to=["bb"], rule_cost=[1] → -1

Правило меняет только пару букв. Покрыть три позиции парами можно лишь с пересечением, а пересекающиеся участки запрещены — ответ -1.

Ограничения
  • 1 ≤ len(start) = len(goal) ≤ 1000
  • 1 ≤ len(rule_cost) = len(rule_from) = len(rule_to) ≤ 100
  • 1 ≤ len(rule_from[i]) = len(rule_to[i]) ≤ len(start)
  • rule_from[i] ≠ rule_to[i]
  • 1 ≤ rule_cost[i] ≤ 10⁶
  • все строки состоят из строчных латинских букв
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиВсе способы расставить пробелы СложнаяСлова из других слов СложнаяШарик и лунка СложнаяРазбиение на слова из словаря СредняяЦепочки отношений Средняя
загружаем Python…
Вход
start="cat", goal="cot", rule_from=["a", "e"], rule_to=["e", "o"], rule_cost=[2, 3]
Ожидается
5

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