我有一个这样的问题:有多少种方法可以改变“avocadojuice”中的字母顺序,以便元音首先出现,例如“ovacadojuice”就是一个解决方案?出发点——“牛油果汁”也是一个解决方案。
我知道itertools.permutations
可以做这样的事情,但如果单词太长,就会弹出内存错误。有没有办法防止这种情况,或者也许有另一个内置模块可以解决这个问题?先感谢您!
附:我知道如何将排列元组转换为字符串。
最佳答案
这是一个暴力破解问题可能不可行的情况。您需要计算 n 个元素的唯一排列数量,并考虑到某些元素是重复的。
对此有一个数学公式,并且 some excellent answers在其他堆栈交换站点上。
只有 a
和 o
重复,因此 avocadojuice
的唯一排列数为
(12!) / (2!2!)
或119750400
每 12 个字符的字符串大约需要 45 个字节
(至少在我的机器上),仅存储近 1.2 亿个排列就需要超过 5 GB 的内存!您会明白为什么暴力破解并不是一个好主意。
不过,您的问题还有一个额外要求,即排列必须以元音开头。鉴于只有 5 个元音,您应该能够计算出每个给定元音作为第一个字符的可能排列。
(11! / 2!) + # a (only o is repeated)
(11! / (2!2!)) + # e
(11! / (2!2!)) + # i
(11! / 2!) + # o (only a is repeated)
(11! / (2!2!)) + # u
关于python - 使用itertools获得大量独特的排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36871110/