最长绝对文件路径——算法面试刷题1(google),字符串处理,使用tree遍历dfs类似思路
假设我们通过以下的方式用字符串来抽象我们的文件系统:
字符串"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
包含一个包含文件 file2.ext 的二级子目录 subsubdir2
。
我们有兴趣找到文件系统中文件的最长绝对路径(字符数)。例如,在上面的第二个例子中,最长的绝对路径是“dir/subdir2/subsubdir2/file2.ext”
,其长度为 32
(不包括双引号)。
给定一个以上述格式表示文件系统的字符串,返回抽象文件系统中文件最长绝对路径的长度。如果系统中没有文件,则返回 0
。
- 一个文件的名称至少包含一个
.
和扩展名。 - 目录或子目录的名称不会包含
.
。 - 时间复杂度要求:
O(n)
其中 n 是输入字符串的大小。 - 请注意如果有另一条路径
aaaaaaaaaaaaaaaaaaaaa / sth.png
存在的话,a/aa/aaa/file1.txt
不是最长的文件路径。---这个东西巨坑!!!以为是树的最长路径,结果还不是!!!。 ****我写的代码:12345678910111213141516171819202122232425262728293031323334class
Solution:
"""
@param input: an abstract file system
@return: return the length of the longest absolute path to file
"""
def
lengthLongestPath(
self
,
input
):
# write your code here
ans
=
0
path
=
[]
lines
=
input
.split(
"\n"
)
for
line
in
lines:
cnt
=
self
.count_tab(line)
path_name
=
self
.get_path_name(line)
if
cnt <
len
(path):
path[cnt]
=
path_name
else
:
path.append(path_name)
if
self
.is_file(path_name):
length
=
len
(
"/"
.join(path[:cnt
+
1
]))
if
length > ans: ans
=
length
return
ans
def
count_tab(
self
, s):
return
s.count(
"\t"
)
def
get_path_name(
self
, s):
index
=
s.rfind(
"\t"
)
if
index >
=
0
:
return
s[index
+
1
:]
# +2 is error. \t is a char!!!
else
:
return
s
def
is_file(
self
, f):
return
f.find(
"."
) >
=
0
参考代码:
123456789101112131415161718192021import
re
class
Solution:
# @param {string} input an abstract file system
# @return {int} return the length of the longest absolute path to file
def
lengthLongestPath(
self
,
input
):
# Write your code here
dict
=
collections.defaultdict(
lambda
: "")
lines
=
input
.split(
"\n"
)
n
=
len
(lines)
result
=
0
for
i
in
xrange
(n):
count
=
lines[i].count(
"\t"
)
lines[i]
=
dict
[count
-
1
]
+
re.sub(
"\\t+"
,
"/"
, lines[i])
if
"."
in
lines[i]:
result
=
max
(result,
len
(lines[i]))
dict
[count]
=
lines[i]
return
result
值得借鉴的地方:
1、re.sub() 替换连续\t为/
2、使用dict来存储路径长度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2017-04-19 赴美生子怀孕前和怀孕后保险——备孕前2年可以买备孕险,怀孕生产意外或者孩子意外可以买孕中险
2017-04-19 美国诚实签经验——我准备了家庭预算表 和 保险,麻烦您看下,谢谢
2017-04-19 美国诚实签经验——不要插队
2017-04-19 美国诚实签经验——回答签证官的问题时,一定要问什么才答什么,不要犹豫改口、做很多解释或开玩笑,自信且镇静地与他对话,着装得体、举止自然、言谈自信
2017-04-19 美国诚实签经验——IMG全球医疗险,TODO
2017-04-19 美国诚实签经验——要观察面试官,能识人,找友好的面试官
2017-04-19 美国诚实签经验——不要抢答,两个人一起签,要让与社会交流多、表达能力强的人为主导,抓住问题核心回答,重要问题回答时补充材料