rustgym/leetcode/
_388_longest_absolute_file_path.rs

1struct Solution;
2
3struct Folder {
4    level: usize,
5    length: usize,
6}
7
8impl Solution {
9    fn length_longest_path(input: String) -> i32 {
10        let mut stack: Vec<Folder> = vec![];
11        let mut folder_length = 0;
12        let mut max = 0;
13        for line in input.split('\n') {
14            let s = line.chars();
15            let mut level: usize = 0;
16            let mut is_folder = true;
17            for c in s {
18                match c {
19                    '\t' => {
20                        level += 1;
21                    }
22                    '.' => {
23                        is_folder = false;
24                        break;
25                    }
26                    _ => {}
27                }
28            }
29            let name = line[level..].to_string();
30            while let Some(top) = stack.pop() {
31                if top.level >= level {
32                    folder_length -= top.length;
33                } else {
34                    stack.push(top);
35                    break;
36                }
37            }
38            if is_folder {
39                let length = name.len() + 1;
40                let folder = Folder { level, length };
41                stack.push(folder);
42                folder_length += length;
43            } else {
44                max = max.max(name.len() + folder_length);
45            }
46        }
47        max as i32
48    }
49}
50
51#[test]
52fn test() {
53    let input =
54        "dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext"
55            .to_string();
56    let res = 32;
57    assert_eq!(Solution::length_longest_path(input), res);
58}