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

Math - Find The Number Of Permutations Between Two Strings

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

我知道如何从 A-ZZZ 中找到排列数,但我有很多时间尝试应用 inclusion-exclusion 集合。这是场景,为简单起见,字符集将仅为 A - Z,并且不区分大小写,因此 "A" = "a".

用户输入的范围是"ABC"到"AXE"。所以我需要的唯一计数是在这两者之间。所以伪逻辑将获得 A - ZZZ 的完整总数,然后我需要排除 "ABC" 之前的所有内容和 "AXE" 之后的所有内容。

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

谢谢,

戴夫

最简单的解决方案是将两个字符串都视为 base-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个字符串

基本思路是使用基数为 26 的 positional numeral system(所有字母从 A 到 Z)。

这种方法只有一个问题:
它不能处理空字符,因为它们不遵循 "default" 行为,因为它们只能作为前缀出现。

这个问题的解决方法是从

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

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

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

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