Skip to content
Related Articles

Related Articles

Python | All Permutations of a string in lexicographical order without using recursion
  • Last Updated : 26 Aug, 2019

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.

filter_none

edit
close

play_arrow

link
brightness_4
code

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)

chevron_right


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.
  • filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    # 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)

    chevron_right

    
    

    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

    Attention geek! Strengthen your foundations with the Python Programming Foundation Course and learn the basics.

    To begin with, your interview preparations Enhance your Data Structures concepts with the Python DS Course.

    My Personal Notes arrow_drop_up
    Recommended Articles
    Page :