【问题标题】:Number of distinct palindromic substrings不同回文子串的数量
【发布时间】:2013-12-26 17:33:01
【问题描述】:

给定一个字符串,我知道如何使用 Manacher 算法在线性时间内找到 回文子串的数量。但现在我需要找到 distinct/unique 回文子串的数量。现在,这可能会导致 O(n + n^2) 算法 - 一个 'n' 用于查找所有此类子字符串,而 n^2 用于将这些子字符串中的每一个与已找到的子字符串进行比较,以检查它是否是唯一的。

我确信有一种更复杂的算法。我在想也许用后缀树试试运气?有没有时间复杂度更好的算法?

【问题讨论】:

  • 不将每个元素与其他元素进行比较会导致 n² 吗?所以我认为它是 O(n + n²) = O(n²)。尽管如此,我同意这仍然很糟糕。
  • @CompuChip 是的,我的错。已编辑。

标签: string algorithm substring time-complexity palindrome


【解决方案1】:

截至 2015 年,有一种线性时间算法用于计算给定字符串 S 的不同回文子串的数量。您可以使用称为 eertree (or palindromic tree) 的数据结构,如中所述链接的论文。这个想法相当复杂,但前提是构建回文串,并以与Aho-Corasick Algorithm 的故障函数类似的方式使用最长的适当回文后缀对其进行扩充。更多详情见原论文:https://arxiv.org/pdf/1506.04862.pdf

【讨论】:

    【解决方案2】:

    我只会将您找到的子字符串放入哈希表中,以防止两次保存相同的结果。

    哈希表的访问时间是 O(1)。

    【讨论】:

    • 我知道如何在线性时间内找到此类子字符串的 number 个,而不是子字符串本身。基本上我说的是 Manacher 算法。
    • @LiamWillis: Wikipedia en.wikipedia.org/wiki/Longest_palindromic_substring 没有提到 number 但明确指出:但是,正如 Apostolico、Breslauer 和 Galil (1995) 所观察到的,同样的算法也可用于在输入字符串中的任何位置查找所有最大回文子字符串,同样是在线性时间内。 注意这个句子中使用的词 find。我很困惑。
    • 在相同的 Manacher 算法中,当您在中心周围找到子字符串时,只需按照 @zavg 的建议将其存储在哈希表中。
    • 我们必须计算所有可能的回文串的哈希值,并且在长度为 L 的字符串中我们可以有 L^2 个回文串,所以算法不会变成 O(n^2)。跨度>
    猜你喜欢
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 2014-09-25
    相关资源
    最近更新 更多