388. Longest Absolute File Path
題目網址:https://leetcode.cn/problems/longest-absolute-file-path/
題意:假設有一個同時儲存檔案和目錄的 file system。下圖展示了 file system 的一個範例:
dir作為根目錄中的唯一目錄, 其中dir包含兩個子目錄subdir1和subdir2
subdir1包含檔案file1.ext和子目錄subsubdir1subdir2包含子目錄subsubdir2, 該子目錄下包含檔案file2.ext文字格式如下所示(其中
⟶表示tab):
上面的 file system 以 code 格式可表示為(其中
\n、\t分別表示換行、tab)
file system 中每個檔案、目錄都有一個唯一的絕對路徑, e.g.
file2.ext的絕對路徑是dir/subdir2/subsubdir2/file2.ext
- 每個目錄名由字母、數字、
/or 空格所組成- 每個檔案名遵循
name.extension的格式, 其中name和extension由字母、數字和、/or 空格所組成給一 file system 的 code 格式 string
input, 返回 file system 中指向檔案的最長絕對路徑之長度。若 file system 中沒有檔案, 則返回0。



Solution:
想法:level 最大的 file 絕對路徑的長度不一定會是最長的 , 所以不能直接使用 Greedy。e.g. 下圖中, level 較大的
dir/abc/1.txt長度比dir/123456789.jpg小
故分成以下步驟:
- 先根據
\\n拆出每個 file- 再根據
\\t計算出當前 file 的 level- 將 file 中的
\\t去掉, 並加入到dir[level]中- 加總
sum{dir[i] | 0 ≤ i ≤ level}, 最後再加上level(因為每一個 level 都會在絕對路徑中產生一個/)e.g.
input = dir\\n\\tsubdir1\\n\\tsubdir2\\n\\t\\tfile.ext
- 首先, 會先拆出
dir、\\tsubdir1、\\tsubdir2、\\t\\tfile.ext四個 file- 最一開始,
dir會是空的, 然後會隨著 file 的 level 增加而不斷 resize- 將每個 file 根據 level 加入到
dir中, 若該 file 包含.則要計算長度
- file
dir的level = 0➔dir[0] = dir- file
\\tsubdir1的level = 1➔dir[1] = subdir1- file
\\tsubdir2的level = 1➔dir[1] = subdir2直接覆蓋掉原本的dir[1]
(直接覆蓋是沒問題的, 因為當某個file.ext被加入時, 其所有 parent dir 一定都在dir中, 因為其 parent dir 一定會先被拜訪, 並覆寫掉之前 file 的 dir 資訊)- file
\\t\\tfile.ext的level = 2➔dir[2] = file.ext- 因為
file.ext為檔案, 故要加總當前dir[0~level]的長度- 此時加總了
dir、subdir2、file.ext的長度, 但別忘了絕對路徑是dir/subdir2/file.ext, 還要加上/的個數, 也就是file.ext的level才為答案
class Solution { |
- time:$O(n)$ ➔ for loop 遍歷
input - space:$O(n)$ ➔
files紀錄每個 file 的名稱
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論



