zoukankan      html  css  js  c++  java
  • Leetcode 388.文件的最长绝对路径

    文件的最长绝对路径

    假设我们以下述方式将我们的文件系统抽象成一个字符串:

    字符串 "dir subdir1 subdir2 file.ext" 表示:

    dir

    subdir1

    subdir2

    file.ext

    目录 dir 包含一个空的子目录 subdir1 和一个包含一个文件 file.ext 的子目录 subdir2 。

    字符串 "dir subdir1 file1.ext subsubdir1 subdir2 subsubdir2 file2.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 就不是一个最长的路径。

    法1:真Stack。
    具体对每一行:
    1.while循环对比现在这行的等级和栈顶等级,只要栈顶等级更高或者和我平级就都吐掉,同时更新length.
    2.把当前这行加入栈里,更新length。
    3.如果当前这行有文件,打一下擂台确认最大长度。
    细节:
    1.Stack结构为Stack<String>而不可Stack<Integer>,因为你要记录的信息有当前这行的长度和这行的等级两个数据,那你要么需要两个stack要么就直接存string之后又需求再去求。
    2.把原始数组先用split函数拆成一行一行简单很多!
    3.计算等级也就是统计有多少个' ',最简单的方法是直接line.lastIndexOf(" ") + 1;
    4.string的split()还有contains()都要求输入参数为""而不可以是'',尽量这种题目输入单个字符也用""吧。目前就知道sb是可以直接append ''的。
    5.' ', ' '是一个字符而不是两个
    6.更新最后返回的长度的时候要用s.length() - level(s) + 1; 减掉前面的tab,+1是因为题目要求的长度要计算加入层级分隔符'/'的长度。另外在打擂台的时候又要用count - 1是因为path格式的最后是不带'/'的。

     1 import java.util.Stack;
     2 
     3 class Solution {
     4     public static int lengthLongestPath(String input) {
     5         // P1: 不可Stack<Integer>只存长度,你还需要记忆栈顶是第几层的,所以你要么两个stack要么stack<String>存整个。
     6         Stack<String> stack = new Stack<>();
     7         // P2: '
    ', '	'是一个字符而不是两个
     8         // P3: 先split成一行一行简单很多!
     9         // P4 string.split()和string.contains()里面只能填string不能char!一般还是都用""吧就sb.append可以用char
    10         String[] strs = input.split("
    ");
    11         int ans = 0;
    12         int count = 0;
    13 
    14         for (String s : strs) {
    15             while (!stack.isEmpty() && level(s) <= level(stack.peek())) {
    16                 String top = stack.pop();
    17                 count -= (top.length() - level(top) + 1);
    18             }
    19             stack.push(s);
    20             // P5: +1是为了path里的'/', 对比时的-1是为了path最后没有'/'
    21             count += s.length() - level(s) + 1;
    22             if (s.contains(".")) {
    23                 ans = Math.max(ans, count - 1);
    24             }
    25         }
    26         return ans;
    27     }
    28 
    29     private static int level(String s) {
    30         int i = 0, sum = 0;
    31         while (s.charAt(i++) == '	') {
    32             sum++;
    33         }
    34         return sum;
    35     }
    36 
    37     public static void main(String[] args){
    38         //"dir
    	subdir1
    	subdir2
    		file.ext"
    39         String path="dir
    	subdir1
    	subdir2
    		file.ext";
    40         lengthLongestPath(path);
    41     }
    42 }
  • 相关阅读:
    如何使用go module导入本地包
    gin-vue-admin 03 项目打包上线
    golang map转xml
    vim简明文档
    goframe gf-cli的使用
    supervisor 的安装与使用
    element Tree 树形控件
    gin-vue-admin开发教程 02 了解项目目录结构和代码执行的流程
    gin-vue-admin开发教程 01安装与启用
    oraclesql遇见的问题(一)
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10235365.html
Copyright © 2011-2022 走看看