Ruby按顺序从字符串中获取所有长度的排列
这是我的代码 –
$arr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-" def scan(f) begin if f.size == 6 exit end $arr.each_char do |y| t = f + y puts t scan(t) end end end
我希望打印所有排列和长度达到6,我尝试过这种递归方法。 我得到的输出是 –
A AA AAA AAAA AAAAA
不过,我寻求这样的事情 –
A AA AB AC . . AZ AAA AAB . . AAZ . . upto 6 chars
在评论递归调用时,我看到它打印出来
AA AB AC . .
没有递归但没有递归就没问题。 任何种类的建议都表示赞赏。 谢谢。
数组#repeated_permutation可以为你做繁重的工作:
$arr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-" def scan characters = $arr.chars (1..6).each do |length| characters.repeated_permutation(length) do |sequence| t = sequence.join puts t end end end
或者作为一个更可重用的枚举器:
CHARACTERS = [*"A".."Z", *"a".."z", *"0".."9", "_", "-"] def each_permuted_string(max_length = 6, &block) sequences = (1..max_length).map { |n| CHARACTERS.repeated_permutation(n) } if block_given? sequences.each { |seq| seq.lazy.map(&:join).each(&block) } else enum_for(__method__, max_length) { sequences.map(&:size).inject(:+) } end end each_permuted_string do |t| puts t end
但是,这需要很长时间 – each_permuted_string.size => 69810262080
值。 这听起来像是一个XY问题 ,你可以通过询问有关你正在解决的更高级别问题的问题来获得更好的解决方案。
由于您希望将A
, AA
, AAA
等包含在结果列表中,因此您可能会发现repeated_permutations方法很有用,因为您需要重复排列。
不幸的是,排列的数量非常大( $arr
包含64个符号),并且必须计算最多6个字符的排列。 排列的数量是:
64^7 = 4_398_046_511_104
但是,这是一个计算多达6
字符的排列的例子:
(1..6).to_a.flat_map { |i| $arr.chars.repeated_permutation(i).map(&:join) }
即使是4
也是很慢,但这取决于你。