Нам даны две последовательности строчных букв латинского алфавита. Они имеют одинаковую длину и имеют одинаковое количество заданных типов букв (первое имеет равное число t как второе и так на). Мы должны найти минимальное количество свопов (под "свопом" мы подразумеваем изменение порядок двух соседних букв), необходимых для преобразуйте первую последовательность во вторую. Мы можно смело предположить, что каждая из двух последовательностей МОЖЕТ быть преобразована друг к другу. Мы могли бы сделать это с помощью грубой силы, но последовательности слишком велики для этого.
Ввод:
Длина последовательностей (не менее 2, не более 999999) и затем две последовательности.Вывод:
Целое число, представляющее количество свопов, необходимых для последовательности, чтобы они стали одинаковыми.Пример:
{5, aaaaa, aaaaa} должен выводить {0},
{4, abcd, acdb} должен выводить {2}.
Первое, что мне пришло в голову, - пузырь. Мы можем просто пузыриться по последовательности, подсчитывающей каждый своп. Проблема в том, что: a) это O (n ^ 2) худший случай b) Я не убежден, что это даст мне наименьшее число для каждого случая... Даже оптимизированный пузырьковый корабль, похоже, не делает этого трюка. Мы могли бы реализовать вид коктейля, который бы разрешил проблему с черепахами - но даст ли он мне лучшую производительность? Или может быть что-то более простое/быстрое?
Этот вопрос также может быть сформулирован как: Как определить расстояние редактирования между двумя строками, когда разрешена только операция?