最长绝对文件路径——算法面试刷题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 包含两个子目录 subdir1subdir2subdir1 包含一个文件 file1.ext 和一个空的二级子目录 subsubdir1subdir2 包含一个包含文件 file2.ext 的二级子目录 subsubdir2
我们有兴趣找到文件系统中文件的最长绝对路径(字符数)。例如,在上面的第二个例子中,最长的绝对路径是“dir/subdir2/subsubdir2/file2.ext”,其长度为 32 (不包括双引号)。
给定一个以上述格式表示文件系统的字符串,返回抽象文件系统中文件最长绝对路径的长度。如果系统中没有文件,则返回 0

 
  • 一个文件的名称至少包含一个 . 和扩展名。
  • 目录或子目录的名称不会包含 .
  • 时间复杂度要求: O(n) 其中 n 是输入字符串的大小。
  • 注意如果有另一条路径 aaaaaaaaaaaaaaaaaaaaa / sth.png 存在的话, a/aa/aaa/file1.txt 不是最长的文件路径。---这个东西巨坑!!!以为是树的最长路径,结果还不是!!!。   ****我写的代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    class 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

    参考代码:

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import 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来存储路径长度

posted @   bonelee  阅读(491)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.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 美国诚实签经验——不要抢答,两个人一起签,要让与社会交流多、表达能力强的人为主导,抓住问题核心回答,重要问题回答时补充材料
点击右上角即可分享
微信分享提示