如何在python中找到给定字符串的所有排列?

我尝试了这种方法,但结果出错了。因此,有什么想法可以解决此代码段吗?

def swap(seq,i,j):
    temp = 0
    temp = seq[i]
    seq[i] = seq[j]
    seq[j] = temp

def all_possible_strings(seq):
    list_of_results = []
    for i in range(len(seq)):
        for j in range(len(seq)):
            copy_of_seq = seq[:]

            swap(copy_of_seq,j)

            list_of_results.append("".join(copy_of_seq))

    return list_of_results

这是输出: ['abc','bac','cba','bac','abc','acb','cba','acb','abc']

SJ1988GG 回答:如何在python中找到给定字符串的所有排列?

您可以使用itertools.permutations

import itertools

seq = 'abc'
list_of_results = [''.join(p) for p in itertools.permutations(seq)]
print(list_of_results)

输出:

['abc','acb','bac','bca','cab','cba']
,

您的算法可能无法解决所有排列问题。

请注意,(i,j)对可以是任何索引对。但是,对于代码中的每个排列,都从原始字符串开始并应用一次交换。这可能无法获得所有排列。

假设您以ABCD开始。如果您想要反向排列DCBA,则将无法在一次交换中完成。一次交换最多可以更改2个字符的位置,但所有4个字符都必须位于不同的位置。

请注意,大小为(i,j)的列表可能的n对的数量为n*n = n^2,这与预期的排列n!的数量不同。在几乎所有情况下,n! > n^2都意味着肯定会缺少排列。

此外,您有(1,1)之类的货币对,它导致不执行任何操作的交换(这很好,但是现在(2,2)(3,3)等提供重复的排列) [感谢代码学徒指出这一点] 。您同时拥有(1,2)ACBD,这两个都会导致(2,1),而ACBD也将导致a,b = b,a。这就是为什么最终排列列表中重复排列的原因。

P.S。在Python中,您只需执行{{1}}即可交换两个元素。


堆的算法

此方法的正确实现是使用Heap's algorithm之类的东西,这是对元素进行适当,更复杂的切换以获得所有排列的方法。

您不必每次都创建新的列表副本,而是继续在同一列表上进行交换,只要您按照算法指定的正确顺序进行排列,它将循环遍历所有排列。

我不会在这里详述算法,因为资源在解释它方面做得很好。如果您确实需要显式的Python实现示例,那也就是easy to find

本文链接:https://www.f2er.com/3150378.html

大家都在问