java - LeetCode 988 : Difference between backtracking and depth first search (DFS)

标签 java algorithm depth-first-search backtracking

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

如果使用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);
}

最佳答案

字符串在 Java 中是不可变的,因此这意味着这一行,

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

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

我建议你在回溯方案中添加打印语句sb的状态以及DFS中s的值,看看它每一步如何变化的递归。

关于java - LeetCode 988 : Difference between backtracking and depth first search (DFS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62336860/

相关文章:

python - 这两行如何工作 x2 = x+delta[i][0] , y2 = y+delta[i][1]?

python - 为什么这段代码做的是 closed[init[0]][init[1]] 而不是 closed[init[0]][init[0]]?

graph-algorithm - 该算法在欧拉图中找到欧拉路径是否有反例?

具有一个返回语句的 Java 递归

java - 当应用程序的用户进行更新时,Facebook 是否会触发事件?

algorithm - 构造k边连通子图

c++ - 如何对 Vector 进行排序并删除其中的相同值?

algorithm - 将一个值映射到另一个值并返回

java Producer-Consumer 并不总是终止

java - 读取数据文件