生成具有给定最大长度的所有可能的字符排列

时间:2013-01-17 08:40:24

标签: ruby

我希望像["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只是置换,所以长度不超过3。有什么帮助吗?

1 个答案:

答案 0 :(得分: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)等数组中使用两次相同的字母。