LeetCode 988 smallest string starting from leaf
Given the root of a binary tree, each node has a value from 0 to 25 representing the letters ‘a’ to ‘z’: a value of 0 represents ‘a’, a value of 1 represents ‘b’, and so on.
Find the lexicographically smallest string that starts at a leaf of this tree and ends at the root.
(As a reminder, any shorter prefix of a string is lexicographically smaller: for example, “ab” is lexicographically smaller than “aba”. A leaf of a node is a node that has no children.)
题目意思很好理解 就是虽然树中的值是数字 但是却代表字母 我们要找出一条字典序最小的路径,注意这里的路径指的是从叶子节点到根节点
输出那个最小的字典序字符串。a0 b1
首先想暴力解法 我们可以把这个问题分为两个部分 第一部分是遍历所有的路径(怎么遍历?DFS)第二部分是维护一个字典序最小的路径 至于如何比较两个字符串字典序?直接str1.compareTo(str2)即可 如果小于0,则说明str1字典序比较小。
所以还是要的得到所有的路径 之前我们遇到过输出所有路径的问题,当然现在要求倒序 那怎么办?这里就不要心那么死,直接正常输出然后倒序一下就行了。
class Solution {
String ans = "~"; //global minimum,因为之后涉及到字符串之间的比较 所以这里要初始化为一个大于z 这里的"~"是126
public String smallestFromLeaf(TreeNode root) {
if (root == null) return "";
dfs(root, new StringBuilder());
return ans;
}
private void dfs(TreeNode node, StringBuilder sb) {
if (node == null) return;
sb.append((char)('a' + node.val));
if (node.left == null && node.right == null) { //if node reached the leaf
sb.reverse(); //
String S = sb.toString();
sb.reverse(); //reverse back because we are gonna need it later
if (S.compareTo(ans) < 0) {
ans = S; //update minimum
}
}
dfs(node.left, sb);
dfs(node.right, sb);
sb.deleteCharAt(sb.length() - 1);//有backtracking那味了
}
}

浙公网安备 33010602011771号