有没有一种简单的(甚至可能是Kotlin方法)生成给定列表(包含重复元素)的所有排列,它:
- 保持元素的顺序
- 删除所有重复元素
- 包括所有元素
例如:
给定列表:[A, B, C, A, B, D, A]
,我希望得到以下结果:[A, B, C, D]
、[A, C, B, D]
、[B, C, A, D]
、[C, A, B, D]
、[C, B, A, A]
、[B, C, D, A]
、...
(如果存在更多组合)
以下结果无效:
[A, B, C, A, D]
(一式两份A)[A, B, C, A]
(重复A和缺失D)[A, C, D, B]
(顺序错误)
谢谢你的帮助。
4条答案
按热度按时间u91tlkcl1#
尝试下面的解决方案。高度递归但容易理解(最接近我们的想法)。一个缺点是mem的使用。它取决于你写一个非递归的。
输入是一个集合。对于您的问题,您所需要做的就是在调用方法之前将列表转换为集合:
allPermutations (yourList.toSet())
vngu2lb82#
代码见play.kotlinlang.org
输出:
[阿、B、丙、丁]
[B、C、A、D]
[B、C、D、A]
[阿、中、B、丁]
[C、A、B、D]
[丙、B、丁、阿]
为O(listSize * permutationsCount)中的每个列表泛型类型解决问题
u4dcyp6a3#
这里有一种方法可以用某种功能性的风格来完成它。
它首先收集一组不同值的“指令”,这些值与应该保留的出现次数索引配对。为此,它将唯一值“Map”到它们的出现次数。然后,它将它们“折叠”到所有可能的配对组合列表中。折叠操作从一个空排列集开始。然后每个唯一值将其所有可能保留的索引与现有的置换集合相乘。
然后,我们遍历所有指令集以应用指令:从所述原始列表的副本中移除每个唯一值中的除一个之外的所有唯一值。
我认为复杂度是O(n*mn),其中n是不同值的个数,m是不同值的最高重复次数,和另一个答案一样,因为最坏情况下的排列数是mn。
dsf9zpds4#
返回所有排列的扩展函数