[LeetCode] Longest Absolute File Path

388. Longest Absolute File Path

Suppose we have a file system that stores both files and directories. An example of one system is represented in the following picture:

Here, we have dir as the only directory in the root. dir contains two subdirectories, subdir1 and subdir2. subdir1 contains a file file1.ext and subdirectory subsubdir1. subdir2 contains a subdirectory subsubdir2, which contains a file file2.ext.

In text form, it looks like this (with ⟶ representing the tab character):

1
2
3
4
5
6
7
dir
⟶ subdir1
⟶ ⟶ file1.ext
⟶ ⟶ subsubdir1
⟶ subdir2
⟶ ⟶ subsubdir2
⟶ ⟶ ⟶ file2.ext

If we were to write this representation in code, it will look like this: “dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext”. >Note that the ‘\n’ and ‘\t’ are the new-line and tab characters.

Every file and directory has a unique absolute path in the file system, which is the order of directories that must be opened to reach the file/directory itself, all concatenated by ‘/‘s. Using the above example, the absolute path to file2.ext is “dir/subdir2/subsubdir2/file2.ext”. Each directory name consists of letters, digits, and/or spaces. Each file name is of the form name.extension, where name and extension consist of letters, digits, and/or spaces.

Given a string input representing the file system in the explained format, return the length of the longest absolute path to a file in the abstracted file system. If there is no file in the system, return 0.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
private fun depthStringPair(str: String): Pair<Int, String> {
val res = str.replace("\t","");
val depth = (str.length - res.length)
return Pair(depth, res)
}
fun lengthLongestPath(input: String): Int {
val stack = mutableListOf(Pair(-1,""))
var res = 0;
var cur = 0;
input.split("\n").map{ depthStringPair(it); }.forEach {
while(it.first <= stack.last().first) {
cur -= stack.last().second.length;
stack.removeAt(stack.size - 1);
}
stack.add(it);
cur += it.second.length;

if(it.second.contains('.'))
res = Math.max(res, cur + stack.size - 2)
}
return res;
}
}
Author: Song Hayoung
Link: https://songhayoung.github.io/2022/02/12/PS/LeetCode/longest-absolute-file-path/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.