-
Notifications
You must be signed in to change notification settings - Fork 154
/
longest-absolute-file-path.js
67 lines (61 loc) · 2.24 KB
/
longest-absolute-file-path.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**
* 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).
*
* Given a string representing the file system in the above format, return the length of the longest absolute path to
* file in the abstracted file system. 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) where n 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.
*/
/**
* @param {string} input
* @return {number}
*/
const lengthLongestPath = input => {
// The map stores the length of the directory path to current level
const map = new Map();
map.set(0, 0);
let result = 0;
for (let s of input.split('\n')) {
const level = s.lastIndexOf('\t') + 1; // \t is a single character!
const length = s.substring(level).length;
if (s.includes('.')) {
result = Math.max(result, map.get(level) + length);
} else {
map.set(level + 1, map.get(level) + length + 1);
}
}
return result;
};
export { lengthLongestPath };