Java 如何使用树查找最长的公共子串?

Java 如何使用树查找最长的公共子串?,java,algorithm,data-structures,tree,substring,Java,Algorithm,Data Structures,Tree,Substring,根据wiki,最长的公共子字符串问题可以使用后缀树解决。 发件人: 一组字符串的最长公共子字符串可以通过 为字符串构建通用后缀树,然后查找 包含所有字符串中叶节点的最深内部节点 在它下面的子树中 我不明白。 示例:如果我有: ABCDE和XABCZ 然后后缀树是(由于空格而省略了XABCZ的一些分支): 最长的常用子字符串是ABC,但它不是。我看不出wiki的描述在这里有什么帮助。 ABC不是具有叶节点的最深内部节点。 有什么帮助来理解它是如何工作的吗?您实际上还没有画后缀树。如果你做得好的话

根据wiki,最长的公共子字符串问题可以使用后缀树解决。
发件人:

一组字符串的最长公共子字符串可以通过 为字符串构建通用后缀树,然后查找 包含所有字符串中叶节点的最深内部节点 在它下面的子树中

我不明白。
示例:如果我有:
ABCDE
XABCZ

然后后缀树是(由于空格而省略了
XABCZ
的一些分支):

最长的常用子字符串是ABC,但它不是。我看不出wiki的描述在这里有什么帮助。
ABC
不是具有叶节点的最深内部节点。

有什么帮助来理解它是如何工作的吗?

您实际上还没有画后缀树。如果你做得好的话,从根本上说,你只会拥有每一个可能的角色一次。只有当一个字母可以有多个后缀时,树才会分裂。这会将树中的公共子字符串强制在一起,从而使它们可以查找。

就像前面所说的,您的树是不正确的

这就是我在代码中运行“ABCDE$XABCZ”时得到的结果

:

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

:

在(非压缩)后缀trie中,查找包含所有字符串中叶节点的最深内部节点


希望有帮助。

ABC不是最深的内部节点和叶节点。
No,但ABC是树中最长的常见节点串。次长的是
B-C
D-E
,每个节点有两个。是的
ABC
是最长的公共字符串。但我不明白维基描述如何帮助我在程序上找到它。你必须阅读另一个维基:。可能有一些更好(更容易理解)的资源。另请参见@user384706-我认为部分问题在于它不是一个合适的后缀树。您应该只创建一个从root-A-B-C开始的分支,而C将有两个子级:D-E和Z。其他分支的情况类似。这里基本上只是一个后缀列表,所有后缀都有一个根节点指向它们。@twalberg:是的,你说得对。两条蓝色的树枝将是一条。但在这种情况下,我如何通过编程找到它们?我不清楚wiki的描述如何帮助我不确定我在这里是否了解你。如果字符串是:
ABCDBEF
,那么
B
下会有一个子分支,用于
BCDBEF
BEF
,但是对于这个示例,即
ABCDE
我们不是会为每个可能的后缀都有一个分支吗?在您给出的示例图中,应该最多有一个标有“a”的根的子级。你应该合并这两个节点。@LouisWasserman:真的吗?为什么?
A
ABCDE
中的前缀。为什么会有根的子节点是
a
?后缀树的整个要点是将匹配的后缀前缀合并到相同的根中。根上应该有一个分支是
ABC
,最后一个节点应该有两个子节点,一个
X
,一个
DE
@LouisWasserman:Ok。我同意。但在这种情况下,即有两个合并的节点,我如何使用wiki描述以编程方式找到最长的公共子字符串?我被困在这是一个“折叠”后缀树上了吗?另外,数字是什么,例如
(20)
(24)
等?是的,这是折叠的,但折叠意味着将例如“DE”合并到单个节点中。但是,所有后缀树都会将“CDE$”和“CZ$”组合成一个“C”节点,其中有一个“DE$”分支和一个“Z$”分支——但是折叠的后缀树会将“DE$”视为一个节点,而未折叠的后缀树会将“DE$”视为三个节点,每个字符一个。@user384706 Yea,这是一个折叠的树。这些数字只是节点标识符,无需注意。如果你感兴趣的话,我还创建了一个后缀trie。我把它加到了答案上。
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$
└── null
    ├── A
    │   └── B
    │       └── C
    │           ├── D
    │           │   └── (E) ABCDE
    │           └── (Z) ABCZ
    ├── B
    │   └── C
    │       ├── D
    │       │   └── (E) BCDE
    │       └── (Z) BCZ
    ├── C
    │   ├── D
    │   │   └── (E) CDE
    │   └── (Z) CZ
    ├── D
    │   └── (E) DE
    ├── (E) E
    ├── X
    │   └── A
    │       └── B
    │           └── C
    │               └── (Z) XABCZ
    └── (Z) Z