数学 - 查找两个字符串之间的排列数

时间:2017-01-05 18:37:18

标签: math permutation

这不是作业=)。我正在做一个项目,它将自动生成一系列连续的计算机名称,如果列表是一个疯狂的长列表,我想添加一个警告。

我知道如何从A-ZZZ中找到排列的数量,但我有一点时间尝试应用包含 - 排除集。这是一个场景,为了简单起见,char集只是A - Z,不区分大小写,所以“A”=“a”。

用户输入“ABC”到“AX”的范围。所以我需要的唯一数字是在这两者之间。因此,psudo逻辑将获得A - ZZZ的全部总数,然后我需要排除“ABC”之前的所有内容以及“AX”之后的所有内容。

所以问题是,如何在“ABC”之前和“AX”之后找到计数。我查看了所有旧的离散和统计数学书籍,但没有什么真正适合,或者在插入数字时给出了正确答案(n!/ n1!* n2!...)。我甚至试图做一些事情,比如将二进制或十六进制转换为十进制,但正如你所知,这是一个史诗般的失败=)。

谢谢,

戴夫

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是将两个字符串视为基数为26的数字:

ABC = 26^2 * 0 + 26^1 * 1 + 26^0 * 2 = 28(base 10)
ACC = 26^2 * 0 + 26^1 * 2 + 26^0 * 2 = 54(base 10)

ACC - ABC = 54 - 28 = 26

因此[ABC, ACC]范围内总共有27个字符串。

基本思想是使用positional numeral system和26(来自A - Z的所有字母)。

这种方法只有一个问题:
它不能处理空字符,因为那些不会遵循"默认" -behavior,因为它们只能作为前缀出现。

解决此问题的方法是从

扩展我们的值映射
A = 0, B = 1, ..., Z = 25

empty = -1, A = 0, ..., Z = 25

虽然这打破了数字系统的定义,但我们现在能够处理更短的字符串:

magnitude([ZZ, AAA]) = AAA - ZZ + 1 = 0 - (-1) + 1 = 2