Предполагая, что расстояние учитывает только перестановки, вот идея, основанная на перестановках, которая выполняется за линейное время.
Первый шаг алгоритма - убедиться, что две строки действительно эквивалентны по своему содержанию символов. Это может быть сделано за линейное время с использованием хеш-таблицы (или фиксированного массива, который охватывает весь алфавит). Если это не так, то s2 не может рассматриваться как перестановка s1, и «количество свопов» не имеет значения.
На втором шаге подсчитывается минимальное количество обменов, необходимое для преобразования s2 в s1. Это может быть сделано путем проверки перестановки p, которая соответствует преобразованию из s1 в s2. Например, если s1 = "abcde" и s2 = "badce", то p = (2,1,4,3,5), что означает, что позиция 1 содержит элемент # 2, позиция 2 содержит элемент # 1 и т. Д. Перестановка может быть разбита на циклов перестановки в линейном времени. Циклы в этом примере (2,1) (4,3) и (5). Минимальное количество свопов - это общее количество свопов, необходимое для цикла. Цикл длины k требует k-1 перестановок, чтобы «исправить это». Следовательно, число перестановок равно N-C, где N - длина строки, а C - количество циклов. В нашем примере результат равен 2 (своп 1,2, а затем 3,4).
Теперь есть две проблемы, и я думаю, что слишком устал, чтобы решать их прямо сейчас:)
1) Мое решение предполагает, что ни один символ не повторяется, что не всегда так. Некоторая корректировка необходима для правильного расчета количества свопов.
2) Моя формула # MinSwaps = N-C нуждается в доказательстве ... Я не нашел его в сети.