没有重复的排列算法?

时间:2012-05-02 06:04:49

标签: java math permutation combinations

在我制作的程序中,为一组给定的字母生成字谜,我目前的方法是:

  1. 获取所有字母的所有组合
  2. 获取每个组合组的排列
  3. 按字母顺序对结果排列进行排序
  4. 删除重复的条目
  5. 我的问题与排列的数学有关。我想知道是否有可能在删除重复条目后计算存储所有剩余条目所需的数组大小(例如,使用重复字母的数量与排列公式或其他内容)。

    我为我的问题的模糊性道歉,我仍在研究更多关于组合和排列的问题。我将尝试详细阐述我的目标,因为我对组合和排列的理解得到了扩展,并且一旦我重新熟悉了我的程序(去年夏天这是我的一个业余项目)。

2 个答案:

答案 0 :(得分:2)

如果您有n个元素,a[0]重复一个元素,a[1]重复另一个元素,依此类推,直至a[k],那么总数为n!/(a[0]! a[1]! ... a[k]!)不同的排列(最多重复)是Collection<List<Character>> uniquePermutations = Collections2.orderedPermutations(Lists.charactersOf(string));

仅供参考,如果您有兴趣,可以使用Guava编写

.size()

结果将是字符的唯一排列,计算重复项和所有内容。您甚至可以调用其{{1}}方法 - 或者只是查看其实现的提示。 (披露:我向Guava捐款。)

答案 1 :(得分:0)

生成所有排列是非常糟糕的主意。例如,“溢出”一词有40320个排列。因此,随着字长的增长,内存消耗会变得非常高。

我相信你试图解决的问题可以减少,以找出一个词是否是另一个词的字谜。

然后你可以通过计算每个字母出现的次数(它将是26元组)并将这些字母相互比较来解决它。