Python | All Permutations of a string in lexicographical order without using recursion
Last Updated :
11 Jul, 2022
Improve
Write a python program to print all the permutations of a string in lexicographical order.
Examples:
Input : python Output : hnopty hnopyt hnotpy hnotyp hnoypt ...... ytpnho ytpnoh ytpohn ytponh Input : xyz Output : xyz xzy yxz yzx zxy zyx
Method 1: Using the default library itertools function permutations. permutations function will create all the permutations of a given string and then we sort the result to get our desired output.
from itertools import permutations
def lexicographical_permutation(str):
perm = sorted(''.join(chars) for chars in permutations(str))
for x in perm:
print(x)
str ='abc'
lexicographical_permutation(str)
Output :
abc acb bac bca cab cba
Method 2:
- First we create a loop that will run n! ties where n is the length of the string as there will be n! permutations.
- Every iteration prints the string and finds its next larger lexicographical permutation to be printed in the next iteration.
- The next higher permutation is found as :-
- Let the string is called str, find the smallest index i such that all elements in str[i…end] are in descending order.
- If str[i…end] is the entire sequence, i.e. i == 0, then str is the highest permutation. So we simply reverse the entire string to get the smallest permutation which we consider as the next permutation.
- If i > 0, then we reverse str[i…end].
- Then we look for the smallest element in str[i…end] that is greater than str[i – 1] and swap its position with str[i – 1].
- This is then the next permutation.
# import library
from math import factorial
def lexicographical_permutations(str):
# there are going to be n ! permutations where n = len(seq)
for p in range(factorial(len(str))):
print(''.join(str))
i = len(str) - 1
# find i such that str[i:] is the largest sequence with
# elements in descending lexicographic order
while i > 0 and str[i-1] > str[i]:
i -= 1
# reverse str[i:]
str[i:] = reversed(str[i:])
if i > 0:
q = i
# find q such that str[q] is the smallest element
# in str[p:] such that str[q] > str[i - 1]
while str[i-1] > str[q]:
q += 1
# swap str[i - 1] and str[q]
temp = str[i-1]
str[i-1]= str[q]
str[q]= temp
s = 'abcd'
s = list(s)
s.sort()
lexicographical_permutations(s)
Output :
abcd abdc acbd acdb adbc adcb bacd badc bcad bcda bdac bdca cabd cadb cbad cbda cdab cdba dabc dacb dbac dbca dcab dcba
Time Complexity: O(n*n!)
Auxiliary Space: O(1)