非重复子字符串计数.只能通过从字符串的开头或结尾删除来检索子字符串



我最近遇到了以下问题。我有一个解决方案,但不适用于非常大的输入。

非重复子字符串计数。子字符串只能通过从字符串的开头或结尾删除字符来检索

例如

如果给定字符串是 abcde,则不同的子字符串是通过从开头或结尾删除字符来 阿克德 美国广播公司 美国广播公司 血型 一个 二苯醚 生物碱性 公元前 b CDE 光盘 c 德 d e

我的解决方案将每个字符从开头保留为锚点,并通过从末尾删除来生成不同的子字符串。在执行此操作时,我还使用 C# 字典数据结构,它基本上是一个 HashMap 以发现重复项。算法适用于大多数大小合适的输入,但我得到了一些使 C# 字典内存不足的输入。有没有人知道如何使这个算法适用于非常大的输入?

您可以使用后缀数组来解决它。 让字符串"abcde" 那么你的后缀数组可能是 0, 1, 2, 3, 4 代表 (abcde, bcde, cde, de, e(

您还需要相邻后缀之间的(长度(最长公共前缀。

您的答案应该是 L * (L+1(/2 - 总和(LCP(

内存复杂度为 O(N(,如果为 O(N log N(,则为时间复杂度。我不会解释如何获取后缀数组和LCP,因为它太长了,无法解释。您可以在其他地方搜索它。

如果这太难,您可以使用您使用的字典,但放置哈希值而不是完整的子字符串。但这不是准确的解决方案。您可以使用我上面写的解决方案以获得准确的结果。

最新更新