2013-01-17 34 views
0

我想是这样["a", "b", "c"].all_possibilities(4)生产:abc acb bac bca cab cba abca abcb abcc acba acbb acbc ...高达最多使用4字符从abc最后可能 组合 排列。生成字符的所有可能的排列与给定的最大长度

我尝试过排列,但我不认为是这种情况:%w[a b c].permutation.map &:join只是排列,所以长度不超过三。任何帮助?

+0

一个朴素的实现有N个嵌套循环,其中N是您的最大长度。 –

回答

1

那么呢?

class Array 
    def all_possibilities(range) 
    return permutation(range).to_a if range < size 

    (size..range).flat_map do |i| 
     permutation(range - i).flat_map do |e| 
     (self + e).permutation.to_a 
     end 
    end 
    end 
end 

这将返回一个字符串数组数组。

%w(a c).all_possibilities(3) 
# => [["a", "c", "a"], ["a", "a", "c"], ["c", "a", "a"], 
#  ["c", "a", "a"], ["a", "a", "c"], ["a", "c", "a"], 
#  ["a", "c", "c"], ["a", "c", "c"], ["c", "a", "c"], 
#  ["c", "c", "a"], ["c", "a", "c"], ["c", "c", "a"], 
#  ["a", "c"], ["c", "a"]] 

要打印它,你可以做result.map(&:join).join(', ')

ps:有重复,你可以避免使用uniq。发生这种情况的原因是,您可以在%w(a c a)这样的数组中使用两次相同的字母。

+0

嘿!而已!谢谢! – fschuindt

相关问题