Leetcode 388.文件的最长绝对路径
文件的最长绝对路径
假设我们以下述方式将我们的文件系统抽象成一个字符串:
字符串 "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 就不是一个最长的路径。
法1:真Stack。
具体对每一行:
1.while循环对比现在这行的等级和栈顶等级,只要栈顶等级更高或者和我平级就都吐掉,同时更新length.
2.把当前这行加入栈里,更新length。
3.如果当前这行有文件,打一下擂台确认最大长度。
细节:
1.Stack结构为Stack<String>而不可Stack<Integer>,因为你要记录的信息有当前这行的长度和这行的等级两个数据,那你要么需要两个stack要么就直接存string之后又需求再去求。
2.把原始数组先用split函数拆成一行一行简单很多!
3.计算等级也就是统计有多少个'\t',最简单的方法是直接line.lastIndexOf("\t") + 1;
4.string的split()还有contains()都要求输入参数为""而不可以是'',尽量这种题目输入单个字符也用""吧。目前就知道sb是可以直接append ''的。
5.'\n', '\t'是一个字符而不是两个
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: '\n', '\t'是一个字符而不是两个 8 // P3: 先split成一行一行简单很多! 9 // P4 string.split()和string.contains()里面只能填string不能char!一般还是都用""吧就sb.append可以用char 10 String[] strs = input.split("\n"); 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++) == '\t') { 32 sum++; 33 } 34 return sum; 35 } 36 37 public static void main(String[] args){ 38 //"dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext" 39 String path="dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext"; 40 lengthLongestPath(path); 41 } 42 }