Разница между перестановками и комбинациями
Вы ищете перестановку или комбинацию.
'abc'
и 'bac'
- это разные перестановки, но они представляют собой одну и ту же комбинацию {a,b,c}
.
Перестановки 'abc': ''
, 'a'
, 'b'
, 'c'
, 'ab'
, 'ba'
, 'ac'
, 'ca'
, 'bc'
, 'cb'
, 'abc'
, 'acb'
, 'bac'
, 'bca'
, 'cab'
, 'cba'
Комбинации 'abc': {}
, {'a'}
, {'b'}
, {'c'}
, {'a','b'}
, {'b','c'}
, {'a','c'}
, {'a','b','c'}
В питоне
Используйте from itertools import *
(поскольку функции действительно должны быть в пространстве имен по умолчанию) или import itertools
, если хотите.
Если вы заботитесь о перестановках :
permutations(yourString, 8)
Если вы заботитесь о комбинациях :
combinations(yourString, 8)
На других языках
В других языках существуют простые рекурсивные или итеративные алгоритмы для их генерации. Смотрите википедию или stackoverflow. например http://en.wikipedia.org/wiki/Permutation#Systematic_generation_of_all_permutations
Важное примечание
Обратите внимание, что число перестановок N!
, поэтому, например, ваша строка будет иметь
(69 choose 8) = 8 billion
комбинаций длины 8 и, следовательно, ...
(69 choose 8) * 8! ~= 3.37 × 10^14
перестановок длины 8.
Вам не хватит памяти, если вы храните каждую перестановку. Даже если вы этого не сделаете (потому что вы сокращаете их), запуск современного компьютера займет много времени, может быть, где-то между 1-10 днями.