📌  相关文章
📜  Python|在不使用递归的情况下按字典顺序排列字符串的所有排列

📅  最后修改于: 2022-05-13 01:55:48.053000             🧑  作者: Mango

Python|在不使用递归的情况下按字典顺序排列字符串的所有排列

编写一个Python程序以按字典顺序打印字符串的所有排列。

例子:

Input  : python
Output : hnopty
hnopyt
hnotpy
hnotyp
hnoypt
......
ytpnho
ytpnoh
ytpohn
ytponh

Input  : xyz
Output : xyz
xzy
yxz
yzx
zxy
zyx

方法一:
使用默认库 itertools函数排列。
permutations函数将创建给定字符串的所有排列,然后我们对结果进行排序以获得所需的输出。

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)

输出 :

abc
acb
bac
bca
cab
cba

方法二:

  • 首先,我们创建一个将运行 n! 的循环!其中 n 是字符串的长度,因为会有 n!排列。
  • 每次迭代都会打印字符串并找到下一个更大的字典排列以在下一次迭代中打印。
  • 下一个更高的排列被发现为:-
  • 让字符串称为str,找到最小的索引i,使得str[i…end]中的所有元素都按降序排列。
  • 如果str[i…end] 是整个序列,即i == 0,那么str 是最高排列。所以我们简单地反转整个字符串以获得我们认为的下一个排列的最小排列。
  • 如果 i > 0,那么我们反转 str[i…end]。
  • 然后我们在 str[i…end] 中寻找大于 str[i-1] 的最小元素,并将其位置与 str[i-1] 交换。
  • 这就是下一个排列。
    # 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)
    

    输出 :

    abcd
    abdc
    acbd
    acdb
    adbc
    adcb
    bacd
    badc
    bcad
    bcda
    bdac
    bdca
    cabd
    cadb
    cbad
    cbda
    cdab
    cdba
    dabc
    dacb
    dbac
    dbca
    dcab
    dcba