区分大小写的字符串的组合计数

时间:2011-08-22 08:51:58

标签: string math numbers combinations factorial

我记得,组合数等于n!

但是,对于我的例子,我有字符串“abc”。我希望得到不同注册表的所有组合:aBc或ABc等

所以,abc是3个字符。 3! = 1 * 2 * 3 = 6。 但是,如果我尝试手动完成这项工作 - 我将获得8种变化:

1 abc 2 Abc 3 aBc 4 abC 5 ABc 6 aBC 7 AbC 8 ABC

所以,看起来,回答它2 ^ 3 = 8,但是2是什么? 3 - 是字符串中的注册表计数。什么是2?注册表变体的数量?

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你想知道一个固定的字符串,在混合大写中编写固定字符串有多少种可能的组合。你对源字符串的真实排列不感兴趣,即你不要考虑到abc还有acb,cab,cba等等吗?

如果是这样,我们有一封信

a A

两个字母

ab Ab aB AB

和三个字母

abc Abc aBc abC ABc aBC AbC ABC

等等。如果是这种情况,那么如果您选择正确的基础模型,解决方案就非常简单。您可能已经注意到,结果与我们选择的字符序列无关 - 所以为什么不选择所有a

a A
aa aA Aa AA
aaa aaA aAa aAA Aaa AaA AAa AAA

模式是,对于每个字符,我们有两个可用选项,大写或小写,设置或不设置... 1或0 - 只需将0替换为A,将1替换为1以获取:

0 1
00 01 10 11
000 001 010 011 100 101 110 111

这实际上是二进制计数!因此对于n个字母,可能组合的数量将等于2 ^ n。

答案 1 :(得分:1)

啊,我想我明白你在说什么。如果我理解正确,你正在寻找所有可能的方法来大写字母串中的字母,使得所有的字母不是相同的情况 - 也就是说,给定abc,你会产生

abC aBc aBC Abc AbC ABc

但不是

abc ABC

因为这些版本中的所有字母具有相同的大小写。

如果这是你想要的,那么在长度为n的非空字符串中你可以做到这一点的方式由2 n - 2给出。直观地说,这背后的基本原理是如下。给定一串n个字母,有2个 n 不同的方式来大写该字符串中的所有字母,因为对于每个字符独立于其余字母,该字母可以处于两种状态之一(上层)案件或小写)。如果你考虑所有这些组合,那么你想要禁止的只有两个 - 所有字母都是大写的版本,以及所有字母都是小写的版本。

在你的问题中,你提到n元素序列的组合数是n!。这不太对。有n! n元素序列的排列(假设每个元素是不同的)。例如,有3个! =序列abc的6个排列:

abc  acb  bac  bca  cab  cba

有六种方法可以将三个字母的序列大写,而不给所有字母赋予相同的大写字母,并且abc的六种排列是完全巧合。如果您查看该系列的更多术语,您可以看到它们仅匹配两个位置(2和3):

                                    n = 1   2   3   4   5   6
Permutations (n!)                       1   2   6   24  120 720
Mixed-case capitalizations (2^n - 2)    0   2   6   14  30  62

如果你允许更多的情况而不仅仅是上限和下限(例如,k个不同的版本),那么你可以推广它以获得值k n - k,因为有k n 不同的组合,其中k个都具有相同的大写字母。

希望这有帮助!