当前位置: 首页 > 知识库问答 >
问题:

LeetCode 988:回溯和深度优先搜索(DFS)之间的差异

罗智志
2023-03-14

我对LeetCode988中的回溯解决方案和DFS解决方案感到困惑(从Leaf开始的最小字符串)。

如果使用StringBuilder实现,则需要这一行代码:sb.deleteCharat(Sb.length()-1),而使用String实现则不需要这一行。

有人能帮我解决困惑吗?

回溯(使用StringBuilder)

String ans = "";

public String smallestFromLeaf(TreeNode root) {
    helper(root, new StringBuilder());
    return ans;
 }

private void helper(TreeNode root, StringBuilder sb) {
    if (root == null) return;
    sb.append((char)('a' + root.val));
    if (root.left == null && root.right == null) {
    String candidate = sb.reverse().toString();
    if (ans == "" || candidate.compareTo(ans) < 0) {
        ans = candidate;
        sb.reverse();
    }

    helper(root.left, sb);
    helper(root.right, sb);
    sb.deleteCharAt(sb.length() - 1);
}

DFS(使用字符串)

String ans = "";

public String smallestFromLeaf(TreeNode root) {
    helper(root, "");
    return ans;
}

private void helper(TreeNode root, String s) {
    if (root == null) return;

    s = (char)('a' + root.val) + s;
    if (root.left == null && root.right == null) {
        String candidate = s;
        if (ans == "" || candidate.compareTo(ans) < 0) {
            ans = candidate;
        }
        return;
    }

    helper(root.left, s);
    helper(root.right, s);
}

共有1个答案

董元徽
2023-03-14

字符串在Java中不是可变的,所以这意味着,

s=(char)('a'+root.val)+s;

将创建递归函数接收的新字符串对象。因此,没有回溯解决方案通常具有的“撤消”步骤。而在回溯解决方案中,只创建和传递单个StringBuilder对象。当我们从回溯解决方案中的基本情况返回时(即到达叶节点),我们必须撤消将字符添加到字符串生成器的步骤。

我建议您将打印语句添加到回溯解决方案的sb状态以及DFS中的s值,并查看它如何更改递归的每一步。

 类似资料:
  • 主要内容:深度优先搜索(简称“深搜”或DFS),广度优先搜索,总结前边介绍了有关图的 4 种存储方式,本节介绍如何对存储的图中的顶点进行遍历。常用的遍历方式有两种: 深度优先搜索和 广度优先搜索。 深度优先搜索(简称“深搜”或DFS) 图 1 无向图 深度优先搜索的过程类似于树的先序遍历,首先从例子中体会深度优先搜索。例如图 1 是一个无向图,采用深度优先算法遍历这个图的过程为: 首先任意找一个未被遍历过的顶点,例如从 V1 开始,由于 V1 率先访问过了,所以

  • 我有一个无向连通图。我使用邻接矩阵实现了它,它是一个2维数组。 据我所知,DFS在兄弟节点之前访问子节点。BFS先于孩子探望兄弟姐妹。 这两个我是这样实现的: 如果让我执行一个从D到E的DFS,是D、C、a、E还是D、E。我以为DFS和BFS必须访问每个节点,在这种情况下B不能访问。我不知道我应该如何改变我目前的方法来满足这些要求。

  • 我必须为一个算法开发伪代码,该算法计算给定顶点V和边E的图G=(V,E)中连通分量的数量。 我知道我可以使用深度优先搜索或广度优先搜索来计算连接组件的数量。 但是,我想用最高效的算法来解决这个问题,但是我不确定每个算法的复杂度。 下面是一个用伪代码形式写DFS的尝试。 下面尝试以伪代码形式编写 BFS。 我的讲师说BFS与DFS具有相同的复杂性。 然而,当我搜索深度优先搜索的复杂度时,它是O(V^

  • 本文向大家介绍深度优先搜索,包括了深度优先搜索的使用技巧和注意事项,需要的朋友参考一下 图遍历是按某种系统顺序访问图的所有顶点的问题。遍历图主要有两种方法。 广度优先搜索 深度优先搜索 深度优先搜索(DFS)算法从顶点v开始,然后遍历到之前未访问过的相邻顶点(例如x),并将其标记为“已访问”,然后继续处理x的相邻顶点,依此类推。 如果在任何一个顶点上遇到所有相邻顶点都被访问过,则它将回溯直到找到具

  • 当你从一个顶点开始,沿着某条路往下走,一直走到底,如果走完后发现不能达到目标解,就回溯,返回到上一个节点,换条路,然后继续走到底,如此往复,直至所有可能的结果都被搜索完。通俗理解就是不撞南墙不回头这种感觉,这个就是我们这篇要讲解的内容,下面带领大家结合实例系统的学习一下。 一、什么是DFS? DFS简单讲叫深度优先搜索,就是指:优先考虑深度,换句话说就是一条路走到黑,直到无路可走的情况下,才会选择

  • DFS 全称是 Depth First Search,中文名是深度优先搜索,是一种用于遍历或搜索树或图的算法。所谓深度优先,就是说每次都尝试向更深的节点走。 一、图搜索Graph Search的分类 (1)BFS广度优先(宽搜) (2)DFS深度优先(深搜) 二、深度优先搜索DFS (1)深度优先遍历DFS, 这个策略其实是非常stupid or simple的,比BSF要简单的多 (2)同样,我