Вы должны изменить способ обновления таблицы динамического программирования. В исходном алгоритме рассматриваются хвосты (или головы) двух слов, которые различаются максимум по длине. Обновление является минимумом всех таких возможностей.
Если вы хотите изменить алгоритм так, чтобы изменения в двух смежных местоположениях считались одним, минимум, указанный выше, должен быть рассчитан по хвостам (или головам), которые отличаются не более чем в два раза. Вы можете распространить это на более крупные окрестности, но сложность будет увеличиваться экспоненциально в размере этого соседства.
Вы можете обобщать и назначать затраты, которые зависят от символов, удаленных, вставленных или замененных, но вы должны убедиться, что стоимость, назначаемая вами для парного редактирования, ниже, чем два отдельных редактирования, в противном случае одиночные правки всегда выигрывают.
Пусть слова будут w1 и w2
dist(i,j) = min(
dist(i-2,j-2) && w1(i-1,i) == w2(j-1,j) else
dist(i-1,j-1) && w1(i) == w2(j) else
dist(i,j-1) + cost(w2(j)),
dist(i-1,j) + cost(w1(i)),
dist(i-1,j-1) + cost(w1(i), w2(j)),
dist(i, j-2) + cost(w2(j-1,j)),
dist(i-2, j) + cost(w1(i-1,i)),
dist(i-2,j-2) + cost(w1(i-1,i), w2(j-1,j))
)
Что я имею в виду под &&
, так это то, что эти строки следует рассматривать только в том случае, если выполняются условия.