我有类别和每个类别中的元素总数。
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),两个单词
lspsl
和slpls
的校正项为2。单词总数是(5!/2个/2个!+2)/2=(120/4+2)/2=32/2=16。
对于(1,1,1),校正项为0(2,1,1)的修正项也是0。校正项可以直接从数字a、b和c(作为练习左)计算得出