Автозамена в телефоне

тема: DP 2D · уровень: продвинутый

Условие

Ты печатаешь сообщение в телефоне, а автозамена пытается понять, что ты имел(а) в виду. Телефон умеет исправлять текст тремя типами правок:

Каждая правка стоит 1.

Нужно узнать, сколько правок минимально нужно, чтобы превратить набранную строку в желаемую.

Формат ввода

Даны две строки s и t, каждая в отдельной строке.

Формат вывода

Выведите одно число — минимальную стоимость превращения строки s в строку t.

Ограничения

Пример

Ввод:

kitten
sitting

Вывод:

3

Пояснение к примеру: kitten → sitten (замена k на s), sitten → sittin (замена e на i), sittin → sitting (вставка g).

Как решать — идея подхода

Приём: ДП по двум строкам (расстояние Левенштейна)

Ключевое наблюдение: любые правки превращают строку шаг за шагом, и в конце важно только то, какие префиксы уже приведены друг к другу. Поэтому можно считать ответ для s[:i] и t[:j], а потом наращивать.

Введём dp[i][j] — минимальное число правок, чтобы превратить первые i символов s в первые j символов t. Почему ДП работает: последний шаг в оптимальном преобразовании обязательно один из трёх типов правок, и он переводит нас в одну из «соседних» клеток таблицы.

Переходы (последняя операция):

Минимум из них и есть dp[i][j].

План решения:

Сложность: O(m*n) по времени, при ограничениях 400 это быстро. Память можно сделать O(n), храня только две строки таблицы.

Частая ошибка: перепутать индексы (s[i-1], t[j-1]) и базу dp[0][j], из-за этого ответы «съезжают» на 1.

Решить задачу с автопроверкой на Python →

Куда дальше