avatar

【和毕leetcode】388. 文件的最长绝对路径

题目描述

假设有一个同时存储文件和目录的文件系统。下图展示了文件系统的一个示例:

class="lazyload" data-src="https://assets.leetcode.com/uploads/2020/08/28/mdir.jpg"

这里将 dir 作为根目录中的唯一目录。dir 包含两个子目录 subdir1subdir2subdir1 包含文件 file1.ext 和子目录 subsubdir1subdir2 包含子目录 subsubdir2,该子目录下包含文件 file2.ext

在文本格式中,如下所示(⟶表示制表符):

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

如果是代码表示,上面的文件系统可以写为 "dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext" '\n''\t' 分别是换行符和制表符。

文件系统中的每个文件和文件夹都有一个唯一的 绝对路径 ,即必须打开才能到达文件/目录所在位置的目录顺序,所有路径用 '/' 连接。上面例子中,指向 file2.ext 的 绝对路径 是 "dir/subdir2/subsubdir2/file2.ext" 。每个目录名由字母、数字和/或空格组成,每个文件名遵循 name.extension 的格式,其中 nameextension 由字母、数字和/或空格组成。

给定一个以上述格式表示文件系统的字符串 input ,返回文件系统中 指向 文件 的 最长绝对路径 的长度 。 如果系统中没有文件,返回 0

传送门:https://leetcode-cn.com/problems/longest-absolute-file-path

示例

class="lazyload" data-src="https://assets.leetcode.com/uploads/2020/08/28/dir1.jpg"

1
2
3
输入:input = "dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext"
输出:20
解释:只有一个文件,绝对路径为 "dir/subdir2/file.ext" ,路径长度 20

解题思路

这道题比较麻烦的地方在于读题,其实就是利用 \n \t 表示出了整个文件树。我们首先使用 \n 将不同文件/文件夹分离,依次遍历,根据 \t 的个数确定该文件/文件夹在哪一层(n 个 \t 就在第 n 层)。利用栈存储文件路径,如果是文件的话(文件中一定存在 . 字符,利用这个特点判断是否是文件)就计算一下当前的文件路径长度并维护一个最大长度变量,文件夹可以跳过这步。最后输出最大文件路径长度即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution:
def lengthLongestPath(self, input: str) -> int:
s = []
ptr = 0
ans = 0
for line in input.split('\n'):
index = line.count('\t')
f = line.lstrip('\t')
if index == len(s):
s.append(f)
else:
s[index] = f
if '.' in f:
# print(s,len('/'.join(s[:index + 1])))
ans = max(ans,len('/'.join(s[:index + 1])))
return ans

结果

image.png

文章作者: hobee
文章链接: https://hobeedzc.github.io/2022/04/20/%E3%80%90%E5%92%8C%E6%AF%95leetcode%E3%80%91/%E3%80%90%E5%92%8C%E6%AF%95leetcode%E3%80%91388.%20%E6%96%87%E4%BB%B6%E7%9A%84%E6%9C%80%E9%95%BF%E7%BB%9D%E5%AF%B9%E8%B7%AF%E5%BE%84/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hobee's Blog

评论