题目
难度:★★★☆☆
类型:数据结构
方法:考虑周全
假设我们以下述方式将我们的文件系统抽象成一个字符串:
字符串 "dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext" 表示:
dir
subdir1
subdir2
file.ext
目录 dir 包含一个空的子目录 subdir1 和一个包含一个文件 file.ext 的子目录 subdir2 。
字符串 "dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext" 表示:
dir
subdir1
file1.ext
subsubdir1
subdir2
subsubdir2
file2.ext
目录 dir 包含两个子目录 subdir1 和 subdir2。 subdir1 包含一个文件 file1.ext 和一个空的二级子目录 subsubdir1。subdir2 包含一个二级子目录 subsubdir2 ,其中包含一个文件 file2.ext。
我们致力于寻找我们文件系统中文件的最长 (按字符的数量统计) 绝对路径。例如,在上述的第二个例子中,最长路径为 "dir/subdir2/subsubdir2/file2.ext",其长度为 32 (不包含双引号)。
给定一个以上述格式表示文件系统的字符串,返回文件系统中文件的最长绝对路径的长度。 如果系统中没有文件,返回 0。
说明:
文件名至少存在一个 . 和一个扩展名。
目录或者子目录的名字不能包含 .。
要求时间复杂度为 O(n) ,其中 n 是输入字符串的大小。
请注意,如果存在路径 aaaaaaaaaaaaaaaaaaaaa/sth.png 的话,那么 a/aa/aaa/file1.txt 就不是一个最长的路径。
解答
首先用\n将所有文件或文件夹分离,这样得到的列表中的每个元素中,通过“\t”的数量就能知道这个文件或文件夹的级别。
设置一个深度与路径长度的对应字典,每次遍历都更新当前的字典。至于如何判断一个路径末尾是不是文件,通过判断其中是否存在“.”就可以。
用一个变量统计当前最长路径,并作为结果返回。
class Solution:
def lengthLongestPath(self, input: str) -> int:
depth_dict = {0: 0} # 深度与路径长度的对应字典
max_dir_len = 0 # 最长的路径的长度,初始化为0
for line in input.split("\n"): # 选取每一个路径
depth = line.count('\t') # 计算当前路径深度,根据\t的数量就可以
name = line.lstrip("\t") # 提取当前文件夹或文件的名称
cur_dir_len = len(name) + depth_dict[depth] # 计算当前文件夹或文件在内的路径长度
if "." in name: # 证实当前路径以文件结尾
max_dir_len = max(max_dir_len, cur_dir_len) # 更新最终结果
else: # 证实当前路径以文件夹结尾
depth_dict.update({depth + 1: cur_dir_len + 1}) # 更新深度与路径长度的对应字典
return max_dir_len # 返回结果
如有疑问或建议,欢迎评论区留言~