假设我有一个像这样的字符串:
abcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()-_+={}[]\:;"'?/>.<,`~|€
这基本上是键盘上所有字符的列表。我怎么能得到所有可能的组合,比方说,由这些字符中的8个组成的“单词”?我知道会有数百万种可能性。
干杯!
答案 0 :(得分:8)
排列和组合之间的差异
您正在寻找排列或组合。
'abc'
和'bac'
是不同的排列,但它们是相同的组合{a,b,c}
。
'abc'的排列:''
,'a'
,'b'
,'c'
,'ab'
,'ba'
,'ac'
,'ca'
,'bc'
,'cb'
,'abc'
,'acb'
,'bac'
,'bca'
,'cab'
,{ {1}}
'abc'的组合:'cba'
,{}
,{'a'}
,{'b'}
,{'c'}
,{'a','b'}
,{'b','c'}
,{'a','c'}
在python中
使用{'a','b','c'}
(因为那里的函数确实应该在默认命名空间中),或from itertools import *
如果您愿意。
如果您关心排列:
import itertools
如果您关心组合:
permutations(yourString, 8)
其他语言
在其他语言中,有简单的递归或迭代算法来生成这些。请参阅维基百科或stackoverflow。例如http://en.wikipedia.org/wiki/Permutation#Systematic_generation_of_all_permutations
重要提示
请注意,排列的数量为combinations(yourString, 8)
,因此例如您的字符串会
N!
组合,因此...... (69 choose 8) = 8 billion
排列长度为8。如果要存储每个排列,则内存不足。即使你没有(因为你正在减少它们),它也需要很长时间才能运行,可能在现代计算机上的1-10天之间。