1. 程式人生 > >Leetcode 388.檔案的最長絕對路徑

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 }