我对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/