Возможный дубликат:
Подсчет свопов, необходимых для преобразования одной перестановки в другую
Я ищу алгоритм, который подсчитывал бы какое-то расстояние между строками, где разрешена только операция перестановки двух соседних символов. Например:
string1: "mother"
string2: "motherh"
Distance: 2 (сначала поменяйте местами "h" на "e" и получите "motehr", а затем "h" на " r" в результате получается "motherh")
Я знаю, что расстояние Дамерау-Левенштейна очень похоже на эту задачу, но требует много памяти (мне бы хотелось, чтобы оно работало довольно быстро со словами до 1 000 000 символов) . Я уже написал это:
int amo = 0;
for (int i = 0; i < n; i++)
{
if (fromString[i] == toString[i])
continue;
char toWhat = toString[i];
int where = -1;
for (int j = i; j < n; j++)
{
if (fromString[j] == toWhat)
{
where = j;
break;
}
}
while (where != i)
{
char temp = fromString[where];
fromString[where] = fromString[where - 1];
fromString[where - 1] = temp;
where--;
amo++;
}
}
cout << amo << endl;`
Строки представлены в виде char[n], где n — их длина. Я совершенно уверен, что есть способ сделать это быстрее, и я был бы очень благодарен, если кто-нибудь скажет мне, как это сделать, или напишет исходный код (лучше всего будет Java/Python/C++, но все будет отлично).
P.S. Извините за языковые ошибки, я не англичанин и еще не освоил этот язык.