Минимизируйте перестановку пар символов, чтобы в строке не было двух одинаковых символов.

Опубликовано: 22 Сентября, 2022

Для заданной строки S , состоящей из N символов, задача состоит в том, чтобы найти минимальное количество пар символов, которые необходимо поменять местами, чтобы никакие два соседних символа не были одинаковыми. Если это невозможно сделать, то выведите «-1» .

Примеры:

Input: S = “ABAACD”
Output: 1
Explanation: Swapping S[3] and S[4] modifies the given string S to “ABACAD”. Since no two adjacent characters are the same, the minimum number of operations required is 1.

Input: S = “AABA”
Output: -1

Подход: Данная проблема может быть решена с помощью Backtracking. Идея состоит в том, чтобы сгенерировать все возможные комбинации перестановки пары индексов, а затем, если сгенерированная строка не содержит соседних символов, одинаковых с минимальной перестановкой, то вывести это минимальное количество выполненных операций перестановки. Выполните следующие шаги, чтобы решить проблему:

  • Определите функцию minimumSwaps(string &str, int &minimumSwaps, int swaps=0, int idx) и выполните следующие операции:
    • Если соседние символы строки str различны, то обновите значение MinimumSwaps до минимума из MinimumSwaps и swaps .
    • Перебрать диапазон [idx, N], используя переменную i и выполнив следующие операции:
      • Перебрать диапазон [i + 1, N], используя переменную j и выполняя следующие операции:
        • Поменяйте местами символы в позициях i и j в строке S.
        • Вызовите функцию minimumSwaps(str, MinimumSwaps, swaps+1, i + 1) , чтобы найти другие возможные пары обменов для создания результирующей строки.
        • Поменяйте местами символы в позициях i и j в строке S.
  • Инициализируйте переменную, скажем, ansSwaps как INT_MAX, чтобы сохранить количество требуемых минимальных свопов.
  • Вызовите функцию minimumSwaps(str, ansSwaps), чтобы найти минимальное количество свопов, необходимых для того, чтобы все соседние символы стали разными.
  • После выполнения вышеуказанных шагов, если значение ansSwaps равно INT_MAX, выведите -1 . В противном случае выведите значение ansSwaps в качестве результирующего минимального свопа.

Ниже приведена реализация вышеуказанного подхода:

Временная сложность: O(N 3 *2 N )
Вспомогательное пространство: O(1)

РЕКОМЕНДУЕМЫЕ СТАТЬИ