Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 后缀树:最长重复子字符串实现_Algorithm_String_Data Structures_Suffix Tree_Lcs - Fatal编程技术网

Algorithm 后缀树:最长重复子字符串实现

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的

我已经实现了一个后缀树,它没有被压缩。我想知道如何解决在字符串中查找最长的重新创建子字符串的问题。我知道我们必须找到有两个子节点的最深的内部节点,但是如何编写代码呢。另外,我们如何知道最长的重复子串是什么。我对JAVA中的代码感兴趣。请给出java实现。作为参考,我的三首歌看起来像

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”的路径。提供了一种过滤掉重叠的方法(尽管它也过滤掉了所有相等字母的某些字符串)