Предполагая, что расстояние подсчитывает только свопы, вот идея, основанная на перестановках, которая работает в линейном времени.
Первый шаг алгоритма - гарантировать, что две строки действительно эквивалентны в их содержании символов. Это можно сделать в линейном времени, используя хеш-таблицу (или фиксированный массив, который охватывает весь алфавит). Если это не так, то 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 (swap 1,2, а затем 3,4).
Теперь, есть две проблемы здесь, и я думаю, что я слишком устал, чтобы решить их прямо сейчас :)
1) Мое решение предполагает, что ни один символ не повторяется, что это не всегда так. Для правильного подсчета подсчета обмена необходима некоторая корректировка.
2) Моя формула # MinSwaps = N-C нуждается в доказательстве ... Я не нашел его в Интернете.
что вы пробовали ?? – ajduke
Для этого нет встроенной функции. Разложите в 2D-массив и повторите его. –
Вам нужно как минимум рассказать нам, как вы прочитали ввод. – johnchen902