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