当前位置: 首页 > 知识库问答 >
问题:

为什么我们不使用前缀树(trie)来查找最长的公共子字符串?

颜文昌
2023-03-14

正如维基所说:

一组字符串的最长公共子字符串可以通过为字符串构建一个通用后缀树来找到,然后从其下方子树中的所有字符串中找到具有叶节点的最深内部节点

正如贾斯汀所说:

String = ABCDE$XABCZ$
    End of word character 1 = $
    └── (0)
        ├── (20) $
        ├── (22) ABC
        │   ├── (15) DE$
        │   └── (23) Z$
        ├── (24) BC
        │   ├── (16) DE$
        │   └── (25) Z$
        ├── (26) C
        │   ├── (17) DE$
        │   └── (27) Z$
        ├── (18) DE$
        ├── (19) E$
        ├── (21) XABCZ$
        └── (28) Z$

在(紧凑的)后缀树中,您需要找到最深的内部节点,这些节点包含所有字符串中的叶节点。如果在同一深度有多个节点,则必须比较该节点表示的字符串长度。i、 e.ABC、BC和C都有相同的深度,因此您必须比较ABC、BC和C字符串的长度,看看哪个更长;这显然是ABC。

所以这里有一个问题:为什么我们不构建前缀树来存储所有字符串中的所有后缀?然后我们可以搜索前缀树,找到这些后缀的最长公共前缀。我说不出这两者之间的区别。谁能给我一些线索,为什么我们用后缀树而不是前缀树来解决这个问题?

共有2个答案

澹台星光
2023-03-14

trie用于词典。它不存储后缀。

季俭
2023-03-14

后缀树对于长度为N的字符串只需要O(N)时间和空间。这就是为什么使用它可以在线性时间内解决最长的公共子字符串问题。
在最坏的情况下,将字符串的所有足够项添加到trie需要O(N^2)时间和空间。

因此,将所有字符串的所有后缀添加到trie的想法实际上是正确的,但与具有后缀树的解决方案相比效率低下。

 类似资料:
  • 一组字符串的最长公共子字符串可以通过为字符串构建一个通用后缀树来找到,然后从其下方子树中的所有字符串中找到具有叶节点的最深内部节点 最长的公共子字符串是,但它不是。我看不出wiki的描述在这里有什么帮助。 不是最深的内部节点和叶节点。 有什么帮助来理解它是如何工作的吗?

  • 问题内容: 给定 :列表列表,例如 待办事项 :查找所有子列表中最长的公共前缀。 存在 :在另一个线程“两个列表之间的公共元素未使用Python中的集合”中,建议使用“计数器”,它在python 2.7以上可用。但是,我们当前的项目是用python 2.6编写的,因此未使用“ Counter”。 我目前这样编码: 但是我发现它不是很pythonic,有没有更好的编码方式? 谢谢! 新编辑 :抱歉,

  • 问题内容: 是否有一个regexp可以找到两个字符串的最长公共前缀?而且如果一个正则表达式无法解决这个问题,那么使用正则表达式(perl,ruby,python等)中最精美的代码或oneliner就是什么。 PS:我可以通过编程轻松地做到这一点,我只是想好奇,因为在我看来这可以通过正则表达式解决。 PPS:使用正则表达式的O(n)解决方案可获得额外奖励。来吧,它应该存在! 问题答案: 如果有些字符

  • 问题内容: 我有一个像这样的数组: 我想找到字符串的最长公共前缀。在这种情况下, 我以为我会遵循这个程序 问题 是否有内置函数或更简单的方法? 对于我的5行数组来说可能还不错,但是如果我要做几千行数组,那么将会有很多开销,所以我必须使用起始值进行移动计算,例如=字符串的一半,如果它失败,然后直到它起作用,然后再递增1直到我们成功。这样我们就可以进行最少的比较以获得结果。 是否已经有解决此类问题的公

  • 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。 说明: 所有输入只包含小写字母 a-z 。 话不多说,上code: /** * @param {stri

  • 我有一套弦。其中90%是以开头的URL。我想按字母顺序排序。 对于这个问题,有没有比普通的快速排序/基数排序更好的算法?