LeetCode Q 388 - Longest Absolute File Path
Suppose we abstract our file system by a string in the following manner:
The string "dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext"
represents:
dir
subdir1
subdir2
file.ext
The directory dir
contains an empty sub-directory subdir1
and a sub-directory subdir2
containing a file file.ext
.
The string "dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext"
represents:
dir
subdir1
file1.ext
subsubdir1
subdir2
subsubdir2
file2.ext
The directory dir
contains two sub-directories subdir1
and subdir2
. subdir1
contains a file file1.ext
and an empty second-level sub-directory subsubdir1
. subdir2
contains a second-level sub-directory subsubdir2
containing a file file2.ext
.
We are interested in finding the longest (number of characters) absolute path to a file within our file system.
For example, in the second example above, the longest absolute path is "dir/subdir2/subsubdir2/file2.ext"
, and its length is 32
(not including the double quotes).If there is no file in the system, return 0
.
Note:
- The name of a file contains at least a
.
and an extension. - The name of a directory or sub-directory will not contain a
.
. - Time complexity required:
O(n)
wheren
is the size of the input string.
Notice that a/aa/aaa/file1.txt
is not the longest file path, if there is another path aaaaaaaaaaaaaaaaaaaaa/sth.png
.
Solution:
- Split the given
input
with\n
, get a String arraydirs
. - For each
dir
indirs
, define its level as number of\t
it contains + 1. For example,root
has level 1,\ta
has level 2,\t\tb
has level 3. - Use an int array
stack
to store the total length at each level. - The key point is we keep updating the length at each level.
public int lengthLongestPath(String input) {
if (input == null || input.length() == 0) return 0;
String[] dirs = input.split("\n");
int[] stack = new int[dirs.length() + 1];
for (String dir: dirs) {
int numOfTabs = dir.lastIndexOf("\t"); // \t has length 1!
int curLen = stack[numberOfTabs] + dir.length() - numberOfTabs + 1;
stack[numberOfTabs + 1] = curLen;
if (dir.contains(".")) res = Math.max(res, curLen - 1);
}
return res;
}
Tips:
- The length of
\n, \t
is 1 in Java.