我已经在这个问题上搜索了帖子。但他们都没有明确的答案。
在给定字符串中查找长度为n的最常见子字符串的出现位置。 例如,“deded”,我们将子字符串的长度设置为3.“ded”将是最常见的子字符串,其出现次数为2。 很少有帖子建议使用后缀树,时间复杂度为O(nlgn),空间复杂度为O(n)。 首先,我不熟悉后缀树。我的想法是使用hashmap存储长度为3的每个子字符串的出现。时间是O(n),而空间也是O(n)。这比后缀树好吗?我应该考虑使用hashmap collison吗?
额外:如果解决了上述问题,我们如何解决子串长度无关紧要的问题。只需找到给定字符串中最常见的子字符串。
答案 0 :(得分:2)
如果最常见子字符串的长度并不重要(但是,你希望它大于1),那么最好的解决方案是寻找长度为2的最常见的子字符串。你可以这样做在线性时间内使用后缀树,如果查找后缀树,那么将会清楚如何执行此操作。如果您希望最常见子字符串的长度M是输入参数,那么您可以使用使用散列的乘法和加法散列长度为M的所有子串,其中您将前一个字符串散列值乘以常量然后为字符串中的下一个最低有效值添加值,并将模数模数作为素数P.如果选择模数P,则计算的字符串整数将成为随机选择的素数P,这样就可以存储O(P)内存,如果你认为你的哈希没有碰撞,那么这将在线性时间内完成。如果您假设您的哈希可能有很多冲突,并且子字符串的长度为M且总字符串长度为N,则运行时间将为O(MN),因为您必须检查所有冲突,这在最坏的情况下case可以检查长度为M的所有子字符串,例如,如果您的字符串是一个字符串的字符串。在最坏的情况下,后缀树更好,如果你想要一些细节(但不完全,因为后缀树很复杂)让我知道,我可以在高层次解释如何使用后缀树获得更快的解决方案。