Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
Java 最长重复子字符串后缀树dfs_Java_String_Algorithm_Tree - Fatal编程技术网

Java 最长重复子字符串后缀树dfs

Java 最长重复子字符串后缀树dfs,java,string,algorithm,tree,Java,String,Algorithm,Tree,我在执行这项任务时遇到了一些困难。我知道我需要进行深度优先搜索,以找到最深的路径,该路径将给出子字符串的索引。在实施dfs时遇到了一些问题,可能是我的理解不够: int getDeepestPath(TreeNode node) { int maxDistance = 0; TreeNode maxNode; if(node == null) return 0; System.out.println(node.getSuffix()); if(node.g

我在执行这项任务时遇到了一些困难。我知道我需要进行深度优先搜索,以找到最深的路径,该路径将给出子字符串的索引。在实施dfs时遇到了一些问题,可能是我的理解不够:

int getDeepestPath(TreeNode node)
{
    int maxDistance = 0;
    TreeNode maxNode;
    if(node == null) return 0;
    System.out.println(node.getSuffix());
    if(node.getSuffix() != -1) return 0;  
    else
    {
        TreeNode nextNode = node.getChild();
        while(true)
        {
            int distance = 0;
            if(nextNode != null)
            {
                distance = (nextNode.getRightLabel() -nextNode.getLeftLabel()) + 1;
                System.out.println(distance + " distance");
                distance = getDeepestPath(nextNode,t2Info) + distance;
                if(distance > maxDistance) maxDistance = distance;
                nextNode = nextNode.getSibling();
            }
            else break;
        }
    }

    System.out.println(maxDistance);
    return maxDistance;
}
最终的目标是存储最深的节点和路径的长度——我现在只是想打印路径的长度


谢谢

为什么不用堆栈实现DFS,并向
节点添加一个名为
的变量
。每次将节点推到堆栈上时,标记
visted=true
。伪码

root.visited = true;
root.push()
while(Stack.isEmpty()) {
  if(!root.next.visited) {
    root.next.push()
  }
}
实现查找叶、转到下一个分支和弹出的逻辑。
这是一个通用逻辑,如果你有一个二叉树,你可以改变它,使它更简单,只需两个孩子(左和右)

你的假设是错误的

在后缀树中,每个节点都应该包含终止于该节点的字符串的键列表。如果列表为空,则该节点不定义字符串。不需要在树中找到长路径。例如,如果树中有三个字符串,“app”(1)、“apple”(2)和(5)以及“apple pie”(3),则树的外观如下所示:

"app" 1  
  |  
"le" 2, 5  
  |  
" pie" 3

请您解释一下树节点的“后缀”、“子节点”、“右标签”、“左标签”和“同级节点”是什么?是的,子节点是节点的第一个子节点(链表的头),同级节点是共享当前节点父节点的节点,左和右标签用于后缀树的短边标签索引应该提到get suffix=-1表示节点是分支。请再次阅读您的代码,您是否正在查找最深(最长)的分支?也就是树的高度?如果你不能添加这个简单的变量,那么算法可能会变得有点复杂(内存也很重)。类似于将每个节点的子节点存储在列表中并遍历列表。在这种情况下,列表的数量将为==节点的数量。假设“我需要进行深度优先搜索以找到最深的路径,该路径将给出子字符串的索引”找到最深的分支节点将给出最长重复子字符串的索引。不,不会。在后缀树中,每个节点都可以表示多个字符,所以像“双曲”这样的字符串只能有两个节点深(“hyper”和“bolic”),而像“apple”这样的字符串可以分布在五个节点上(“a”、“p”、“p”、“l”、“e”),所以“apple”有5个节点深,“双曲”只有2个节点深。实际上,如果后缀树不紧凑,则每个节点仅引用1个字符,因此Monkey的语句是正确的。然而,正如Tyler Durden所描述的,后缀树通常是紧凑的。但这句话——不管后缀树是否紧凑——是正确的:“txt[1..n]的最长重复子字符串由后缀树中最深的fork节点表示,其中深度由从根遍历的字符数来衡量”(from)