查找忽略反射的子类别的排列总数

时间:2015-01-26 05:19:19

标签: java algorithm permutation

我有类别和每个类别中的元素总数。

  

for example :   
  2   L,    
  2   S, and   
  1   P

我可以用以下16种方式排列它们。

llpss
llsps
llssp
lplss
lpsls
lslps
lslsp
lspls
lspsl
lsslp
lsspl
pllss
sllps
sllsp
slpls
slslp
  

在您反对列表不完整之前,您应该知道这一点   镜像被认为是等效的。

     

例如,因为“sspll”从后到前与“llpss”相同,   我们将它们视为一个。

     

您将获得一个int [],其中包含每个元素的元素数   类别(L,S,P,A,B)。返回一个int,说明他们可以的方式   排成一列,无视反思。

for example :
 {2, 2, 1}

Returns: 16         // illustrated above.   

{2, 2, 2}

Returns: 48
  

我能想到的算法非常基础:

     
      
  • 将数字转换为各自的字母(L,S,P,A,B;索引0处的B)。
  •   
  • 使用这些字母计算可能的总排列数
  •   
  • 删除反射

         

    但这当然不是最佳解决方案。任何人都可以告诉我任何其他解决方案。   感谢..

  •   

1 个答案:

答案 0 :(得分:1)

类型( a b c )折扣反映的单词数量公式为:

[ (a+b+c)! / a! / b! / c! + correction ] / 2

其中更正是反射等于自己的单词数。

例如,对于(2,2,1),对于两个单词lspslslpls,校正项为2。 单词总数为(5!/ 2!/ 2!+ 2)/ 2 =(120/4 + 2)/ 2 = 32/2 = 16.

对于(1,1,1),校正项为0.对于(2,1,1),校正项也为0。修正项可以直接从数字 a b c 计算得出(作为练习留下。)