|
|
1
5
以上是Ryan Shaw的回答: 根据每个字母的数量,以基数计算每个数字,而不是以二进制进行计数。例如:
因此,我认为:
以及守则:
|
|
|
2
2
下面是生成所有子序列的递归算法。
如果您的兴趣仅仅是计算有多少子序列,那么您可以更有效地进行计算。只需计算每个字母的数量,每个值加1,然后将它们相乘。在上述示例中,对于(3+1)*(3+1)*(3+1)*(3+1)*(2+1)=192个子序列,有3个a、3个b、3个c和2个d。这样做的原因是,您可以在0和3A、0和3B、0和3C、0和2D之间进行选择,以及 所有这些选择都是独立的 |
|
|
3
1
考虑到集合{a,a,a,d,d,d,c,g,h,z,z},您的目标是按顺序列出其所有唯一子集,除了空集: {a} {a,a,a} {a,a,a,d}
看到模式了吗?只需使用一个从0增长到2^n-1的整数。如果整数的第i位是1,则从集合中提取第i个元素。 注意:因为在您的示例中,字符串中有重复项;因此,生成后,可能需要删除重复项。
|
|
|
4
0
嗯,在我看来,有一种解决方案与您的类似,但与您的输出不匹配(请参见我对问题的评论),就是简单地遍历原始字符串的尾部列表(例如,对于“abc”,遍历“abc”、“bc”和“c”),并为每个字符串生成前缀列表(“abc”、“ab”、“a”,然后是“bc”、“b”,然后是“c”)。这和你想要的相比如何? |
|
5
0
我使用了这个java代码( http://www.merriampark.com/comb.htm )结果只有383个。代码生成了太多的副本,所以我不得不扔掉很多。我只得到了383分(见下文)。您可能想看看STL中的下一个组合的C++代码(但是我很难在任何地方找到源代码)。电源组可能是最好的方法(但也可能有重复的方法)。
|