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

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

我能想到的算法是非常基本的:
将数字转换为各自的字母(索引0处的L、S、P、A、B;B)
用这些字母表计算可能的排列总数
消除反射
但这肯定不是最优解。有人能告诉我这个问题的其他解吗。
谢谢。。

最佳答案

(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(作为练习左)计算得出

10-07 13:00
查看更多