我有一个问题:有多少种方法可以改变“avocadojuice”中的字母顺序,以便元音首先出现,例如“ovacadojuice”是一个解决方案?起点 - “鳄梨”也是一种解决方案。
我知道itertools.permutations
可以做这样的事情,但是如果这个词太长就会弹出一个内存错误。有没有办法防止这种情况,或者可能有另一个内置模块,可以解决这个问题?先感谢您!
附:我知道如何将排列元组转换为字符串。
答案 0 :(得分:1)
这是一个粗暴的案例,可能是不可行的问题。您需要计算 n 元素的唯一排列的数量,以解释某些元素重复的事实。
有一个数学公式,some excellent answers在其他堆栈交换网站上。
仅重复a
和o
,因此avocadojuice
的唯一权限数
(12!) / (2!2!)
或119750400
每个12个字符的字符串大约45 bytes
(至少在我的机器上),超过5 gig的内存只是为了存储近1.2亿个排列!你可以看出为什么暴力强迫这不是一个好主意。
你的问题还有一个额外的要求,那就是排列必须以元音开头。鉴于只有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