Algorithm 后缀树:最长重复子字符串实现
我已经实现了一个后缀树,它没有被压缩。我想知道如何解决在字符串中查找最长的重新创建子字符串的问题。我知道我们必须找到有两个子节点的最深的内部节点,但是如何编写代码呢。另外,我们如何知道最长的重复子串是什么。我对JAVA中的代码感兴趣。请给出java实现。作为参考,我的三首歌看起来像Algorithm 后缀树:最长重复子字符串实现,algorithm,string,data-structures,suffix-tree,lcs,Algorithm,String,Data Structures,Suffix Tree,Lcs,我已经实现了一个后缀树,它没有被压缩。我想知道如何解决在字符串中查找最长的重新创建子字符串的问题。我知道我们必须找到有两个子节点的最深的内部节点,但是如何编写代码呢。另外,我们如何知道最长的重复子串是什么。我对JAVA中的代码感兴趣。请给出java实现。作为参考,我的三首歌看起来像 class TrieNode{ char ch; LinkedList<TrieNode> child; } 类三节点{ char ch; LinkedList儿童; } Aho-Corasick的
class TrieNode{
char ch;
LinkedList<TrieNode> child;
}
类三节点{
char ch;
LinkedList儿童;
}
Aho-Corasick的算法如果存储字符串结束字节,则它是只有两个子节点的最深节点
要找到最长的子字符串,您需要执行以下操作:保留对包含2个或更多子节点的最深节点的引用,以及它的深度。这是使用递归函数最容易做到的。要查找最深的节点,还可以执行BFS并选择具有最大级别的节点。我认为具有最大级别的节点也是最深的节点。然后您可以检查它是否有2个子节点。否则就更高。
但不确定这是否有效。有任何评论吗?对,但这将给出允许重叠的答案。我的意思是对于字符串“香蕉”,答案将是“安娜”。我希望不允许重叠。所以答案应该是“an”或“na”好吧,我不知道你所说的重叠是什么意思,也许不止一次使用一个字母?在任何情况下,如果您不想包含特定的字符串,那么在执行深度优先搜索时,只需排除不符合条件的节点。您可以通过在中键入“aaa”来查看重叠问题–它将声明“aa”是一个重复的子字符串,因为在树中[(“$”,Leaf),(“a”,[(“$”,Leaf),(“a”,“[(“$”,Leaf),(“a$”,Leaf)]]
,,具有两个叶后代的最深节点具有前缀为“aa”的路径。提供了一种过滤掉重叠的方法(尽管它也过滤掉了所有相等字母的某些字符串)