Получив строку, выведите все ее перестановки в отсортированном порядке. Например, если входной строкой является «ABC», то вывод должен быть «ABC, ACB, BAC, BCA, CAB, CBA».
Мы обсуждали программу для печати всех перестановок в этом посте, но здесь мы должны печатать перестановки в возрастающем порядке.
Ниже приведены шаги для печати перестановок лексикографического союзника.
1. Сортируйте данную строку в неубывающем порядке и распечатайте ее. Первая перестановка — это всегда строка, отсортированная в неубывающем порядке.
2. Начните генерировать следующую более высокую перестановку. Делать это до следующей более высокой перестановки невозможно. Если мы достигнем перестановки, в которой все символы отсортированы в порядке возрастания, то эта перестановка будет последней перестановкой.
Шаги для генерации следующей более высокой перестановки:
1. Возьмите ранее напечатанную перестановку и найдите в ней самый правый символ, который меньше, чем его следующий символ. Давайте назовем этот персонаж «первым персонажем».
2. Теперь найдите потолок «первого персонажа». Потолок — это самый маленький символ справа от «первого символа», который больше, чем «первый символ». Давайте назовем символ ceil «вторым персонажем».
3. Поменяйте местами два символа, найденные в 2 предыдущих шагах.
4. Сортируйте подстроку (в неубывающем порядке) после исходного индекса «первого символа».
Рассмотрим строку «ABCDEF». Пусть ранее напечатанная перестановка будет «DCFEBA». Следующая перестановка в отсортированном порядке должна быть «DEABCF». Давайте разберемся с вышеуказанными шагами, чтобы найти следующую перестановку. «Первый символ» будет «C». «Второй персонаж» будет «E». После обмена этими двумя мы получаем «DEFCBA». Последний шаг — сортировка подстроки после исходного индекса символа «первый символ». Наконец, мы получаем «DEABCF».
Ниже приведена реализация алгоритма.
|
С
|
Выход:
ABCD ABDC .... .... DCAB DCBA
Верхняя граница сложности времени вышеупомянутой программы O (n ^ 2 xn!). Мы можем оптимизировать шаг 4 вышеупомянутого алгоритма для нахождения следующей перестановки. Вместо сортировки подмассива после «первого символа» мы можем перевернуть подмассив, потому что подмассив, который мы получаем после замены, всегда сортируется в порядке возрастания. Эта оптимизация усложняет время как O (nxn!). Смотрите следующий оптимизированный код.
|
С
|
Вышеуказанные программы печатают повторяющуюся перестановку, когда символы повторяются. Мы можем избежать этого, отслеживая предыдущую перестановку. Во время печати, если текущая перестановка совпадает с предыдущей, мы не будем печатать ее.
Эта статья составлена Aashish Barnwal и рецензирована командой GeeksforGeeks. Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Вывести число в виде строки «A» и «B» в лексикографическом порядке
- Вывести k различных отсортированных перестановок заданного массива
- Вывести все палиндромные перестановки данной строки в алфавитном порядке
- Распечатывать отдельные отсортированные перестановки с дубликатами, разрешенными для ввода
- Распечатать массив строк в отсортированном порядке без копирования одной строки в другую
- Набор питания в лексикографическом порядке
- Найти строку в лексикографическом порядке, которая находится между заданными двумя строками
- Генерация различных подпоследовательностей заданной строки в лексикографическом порядке
- Распечатать все перестановки строки в Java
- Распечатать все палиндромные перестановки строки
- Распечатать все перестановки с повторением символов
- Напишите программу для печати всех перестановок данной строки
- Вывести все различные перестановки данной строки с дубликатами
- Итеративный подход для печати всех перестановок массива
- Вывести первые n различных перестановок строки, используя itertools в Python
0.00 (0%) 0 votes