Kotlin 生成不重复元素的列表排列(按顺序)

dom*_*nik 4 list permutation kotlin

是否有一种简单的(甚至可能是 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](错误的顺序)

感谢您的帮助。

小智 5

尝试下面这个解决方案。大量递归但易于理解(最接近我们的想法)。一个缺点是内存的使用。由你来编写一个非递归的。

fun <T> allPermutations(set: Set<T>): Set<List<T>> {
    if (set.isEmpty()) return emptySet()

    fun <T> _allPermutations(list: List<T>): Set<List<T>> {
        if (list.isEmpty()) return setOf(emptyList())

        val result: MutableSet<List<T>> = mutableSetOf()
        for (i in list.indices) {
            _allPermutations(list - list[i]).forEach {
                item -> result.add(item + list[i])
            }
        }
        return result
    }

    return _allPermutations(set.toList())
}
Run Code Online (Sandbox Code Playgroud)

输入是一个集合。对于您的问题,您需要做的就是在调用该方法之前将列表转换为集合:allPermutations (yourList.toSet())