【发布时间】:2014-09-29 18:04:30
【问题描述】:
我已经搜索过关于这个问题的帖子。但他们都没有明确的答案。
查找给定字符串中长度为 n 的最常见子字符串的出现。 例如,“deded”,我们将子串的长度设置为 3。“ded”将是最常见的子串,它的出现次数为 2。 很少有帖子建议使用后缀树,时间复杂度为 O(nlgn),空间复杂度为 O(n)。 首先,我不熟悉后缀树。我的想法是使用 hashmap 存储每个长度为 3 的子字符串的出现。时间是 O(n),而空间也是 O(n)。这比后缀树好吗?我应该考虑 hashmap 冲突吗?
额外:如果解决了上述问题,我们如何解决子字符串长度无关紧要的问题。只需找到给定字符串中最常见的子字符串即可。
【问题讨论】:
-
您的 hashmap 解决方案简单、优雅,并且可以在线性时间/复杂度下工作(如果子字符串长度是固定的)。为什么你觉得性能是个问题?记住,先做对。过早的优化可能会导致您没有可能永远不需要访问的兔子洞。相同的解决方案适用于任何长度的子字符串,但现在复杂性可能成为问题,其严重性取决于子字符串的最大大小。
-
即使长度不固定,我也没有看到任何复杂性问题。不管检查,你都必须找到所有可能的子字符串,除非你想做一些边缘情况,比如只期望 2 个长度为 5 的字符串的 4 长度子字符串。
-
“deded”最常见的非空子串怎么不是“d”?关于使用散列的复杂度,别忘了计算散列码的复杂度。
-
@greybeard:因为子字符串长度设置为三个。在 OP 的简单情况和第一个示例中,我们只是在寻找长度为 3 的子字符串。
标签: string algorithm substring