字谜索引计算[重复]

Posted

技术标签:

【中文标题】字谜索引计算[重复]【英文标题】:Anagram Index Calculation [duplicate] 【发布时间】:2013-09-09 18:26:45 【问题描述】:

给定一个由字符 A-Z 组成的最长 25 个字符的输入字符串,输出其在输入字符串的所有可能字谜的字母排序列表中的索引。输入字符串不区分大小写。输入字符可以重复。应用程序必须在 500 毫秒内完成,并且占用的内存少于 1GB。

乍一看,如果没有任意精度的数学库,这似乎是不可能的。最坏情况输入是 25 个唯一字符,结果为 25!可能的字谜。 25!比 2^64 大几个数量级。因为索引和字符串之间的关系不是直接的,必须经过计算,所以没有办法简单地将字符串转换为数字。

这来自我前几天收到的一个面试挑战。我无法为他们想出一个解决方案,他们坚持认为确实有一个好的解决方案......

【问题讨论】:

这不是重复的,因为我在这里真正要问的问题是如何在不使用任意精度数学库的情况下做到这一点。 显而易见的答案是:这是不可能的,因为 答案 可以大于 2^64 【参考方案1】:

给定一个单词的字母频率,很容易计算单词的字谜数。它是字符总数的阶乘除以频率的阶乘,这些数字也称为multinomial coefficients。

使用这个事实,您可以通过按字母顺序计算前缀的字谜数来获得任何字谜的索引。例如,以密西西比州为例:字母频率为 I: 4, M: 1, P: 2, S: 4,总共 11!/(4!1!2!4!) = 34650 个字谜。

以 I 开头的字谜数为 10!/(3!1!2!4!) = 12600 以 MII 开头的字谜数为 8!/(2!0!2!4!) = 420 以 MIP 开头的字谜数为 8!/(3!0!1!4!) = 280 以 MISI 开头的字谜数为 7!/(2!0!2!3!) = 210 以 MISP 开头的字谜数为 7!/(3!0!1!3!) = 140 以 MISSII 开头的字谜数为 5!/(1!0!2!2!) = 30 以 MISSIP 开头的字谜数为 5!/(2!0!1!2!) = 30 等等……

将这些数字相加,即可得到索引。但是,是的,您可能需要一些任意精度的数字库,因为正如您所说,在最坏的情况下有 25 个!字谜和索引可能超出 64 位整数的范围。

这感觉不是很优雅,如果有更好的解决方案,我很想听听。

【讨论】:

我觉得这感觉很优雅。我想这就是提问者正在寻找的东西——唯一缺少的是一个 bignum 库或您自己的此类实现。这仍然应该在半秒内运行,并且您已经解决了问题的精神——在不生成所有字谜的情况下执行此操作。 我同意这是一个优雅的解决方案。如果您减少分数并重用计算结果,这也应该与使用 x 计算 x!x! ≈ index 一样快,我认为这是所需的最低计算量。

以上是关于字谜索引计算[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在目标 c 中找到数组内所有字谜的快速方法是啥?

获取数组中最大的字谜组

查找字符串中的所有字谜如何优化

我的 JS 字谜图解决方案的时间、空间复杂度

字谜算法返回重复值

如何设置新索引[重复]