【发布时间】:2014-11-18 01:38:25
【问题描述】:
最近我正在学习如何使用树来解决最长公共子串问题。在从 Wiki 和其他在线资源学习之后,我发现我们应该使用后缀树来查找最长公共子串。
正如维基所说:
一组字符串的最长公共子串可以通过 为字符串构建一个通用的后缀树,然后找到 具有来自所有字符串的叶节点的最深内部节点 在它下面的子树中
正如Justin所说:
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$
在(紧凑)后缀树中,您需要从所有字符串中找到具有叶节点的最深内部节点。 如果在同一深度有多个节点,则必须比较该节点表示的字符串的长度。即 ABC、BC 和 C 都具有相同的深度,因此您必须比较 ABC、BC 和 C 字符串的长度,看看哪个更长;这显然是ABC。
这里我认为从所有字符串中找到具有叶节点的最深内部节点的过程实际上是从所有字符串中找到所有后缀的最长公共前缀的过程。
所以这里有一个问题: 为什么我们不构建前缀树来存储所有字符串的所有后缀?然后我们可以搜索前缀树来找到这些后缀的最长公共前缀。我无法分辨这两者之间的区别。谁能给我一些线索,为什么我们使用后缀树而不是前缀树来解决这个问题?
【问题讨论】:
标签: string algorithm trie suffix-tree longest-substring