假设我需要比较'n'值并找出最少记录中出现的最常见范围,我们怎样才能有效地做到?
例如:
假设值为
AABBCCDD
AABBEEFF
QWBBGGUU
SDBBGGOO
AABBGGHH
在这种情况下,输出应该是AABB。
我们只需要最常见的前提值。所以输出不会是BBGG
可以使用散列图找出一种方法,但如果可能的话,我们需要找到更好的方法。
答案 0 :(得分:1)
找到至少50%字符串共有的最长前缀:
在字符串上运行一次,查看每个字符的第一个字符,计算每个字符出现的次数(甚至更好,使用多数查找算法)。
如果您没有找到多数首字母,则解决方案为空字符串。
如果您确实找到了多数第一个字母,请重复检查第二个字母(计算所有字符串的第二个字母,这些字母具有多数第一个字母,但在确定它是否仍为多数时,或者不是当然必须包括所有字符串)。最终你不再找到多数,回报你所拥有的一切。
一种完全不同的方法:构建所有字符串的Trie,并在每个节点中维护具有该前缀的字符串数量。然后从根向下走树,在每一步寻找大于或等于n/2
的计数。如果找到一个,请按照它。如果你不这样做,停下来。如果你的规则比“多数人共享的最长前缀”更复杂,那么你也可以在Trie的其他地方查找。