Мы можем применить эту операцию любое количество раз.
Но ваш заголовок говорит что-то другое.
Итак, учитывая две строки S1 и S2 размера Nгде количество разных алфавитов в строке одинаково, тогда только мы можем думать о преобразовании.
мы можем сопоставить все символы от 1 до N-2 в обеих строках во всех случаях.Каждый раз, когда мы выбираем символ из первой строки, движение этого символа может быть
-2+1-2+1-2+1..............
Мы можем переместить выбранный символ в эти места обратно в строку
-2,-1,-3,-2,-4,-3....
После сопоставления N-2 символа
Если последние два символа были сопоставлены, то мы преобразовали нашу строку, но они не были автоматически сопоставлены, тогда мы не можем ничего сделать дальше.
Таким образом, проблема заключается в том, что последние два символа мы не можем сделатьчто-нибудь с движением двух персонажей.
Например,
S1 = abdc
S2 = abcd
мы не можем изменить abdc на abcd здесь, потому что из abdc мы можем перейти только к 12 перестановкам из 24:
abdc, dabc, acbd, bdac, dcab, bacd, adcb, bcda, dbca, cbad, cadb, cdba
Оптимально быстрый ответ Подсчет инверсий
В глубине это связано с количеством инверсий в строке
Если инверсии в обеих строках четные или нечетныеru Возможно только преобразование.
Поиск инверсий в строке
int invcount=0,charcount[26]={0};
for(i=0;i<s.size();i++)
{
for(j=s[i];j<='z';j++)
invcount+=charcount[j-s[i]];
charcount[s[i]-'a']++;
}
cout<<invcount;