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 }