【问题标题】:Generate all possible permutations of characters with a given maximum length生成具有给定最大长度的所有可能的字符排列
【发布时间】:2013-01-17 08:40:24
【问题描述】:

我想要像["a", "b", "c"].all_possibilities(4) 这样的东西产生:abc acb bac bca cab cba abca abcb abcc acba acbb acbc ... 直到最后一个可能的 combination 排列,最多使用来自44 字符abc

我尝试了排列,但我认为情况并非如此:%w[a b c].permutation.map &:join 只是排列,所以长度不大于三个。有什么帮助吗?

【问题讨论】:

  • 一个简单的实现有 N 个嵌套循环,其中 N 是您的最大长度。

标签: ruby


【解决方案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(&amp;:join).join(', ')

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

【讨论】:

  • 嘿!而已!谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-02-28
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多