给定一个长度不超过25个字符的输入字符串,由字符A-Z组成,在输入字符串的所有可能字符的字母顺序列表中输出其索引。输入字符串不区分大小写。输入字符可以重复。该应用程序必须在不到500毫秒的时间内完成,并且内存不足1GB。
乍一看,没有任意精度数学库,这看起来是不可能的。最坏的情况输入是25个独特的字符,结果是25!可能的字谜。 25!是数量级大于2 ^ 64。因为索引和字符串之间的关系不是直接的并且必须计算,所以无法简单地将字符串转换为数字。
这来自我前几天接受的采访挑战。我无法为他们提出解决方案,他们坚持认为确实有一个很好的解决方案......
答案 0 :(得分:6)
考虑到单词的字母频率,很容易计算单词的字母数。它是字符总数的阶乘,除以频率的阶乘,这些数字也称为multinomial coefficients。
使用这个事实,您可以通过按字母顺序计算前面字符的字谜数来获得任何字谜的索引。例如,取MISSISSIPPI:字母频率为I:4,M:1,P:2,S:4,共计11!/(4!1!2!4!)= 34650字谜。
将这些数字相加并得到索引。但是,是的,您可能需要一些任意精度数字库,因为,正如您所说,在最坏的情况下有25个! anagrams和索引可能会超出64位整数。
但这并不是很优雅,如果有更好的解决方案,我很乐意听到它。