重複の可能性:
ある順列を別の順列に変換するために必要なスワップのカウント
許可されている操作のみが2つの隣接する文字の転置である、ある種の文字列距離をカウントするアルゴリズムを探しています。例:
string1: "mother"
string2: "moterh"
distance: 2 (最初に "h" を "e" に置き換えて "motehr" を取得し、次に "h" を "r" に置き換えて "moterh"
を取得します) –レーベンシュタイン距離はその問題と非常によく似ていますが、多くのメモリが必要です (1000000 文字までの単語で非常に高速に動作することを望みます)。私はすでにこれを書いています:
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++ が最適ですが、何でも素晴らしいです)。
PS 言語の間違いがあればすみません。私は英語が苦手で、まだその言語を習得していません。