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
就不是一個最長的路徑。
class Solution {
public:
int lengthLongestPath(string input) {
int res = 0, n = input.size(), level = 0;
unordered_map<int, int> m {{0, 0}};
for (int i = 0; i < n; ++i) {
int start = i;
while (i < n && input[i] != '\n' && input[i] != '\t') ++i;
if (i >= n || input[i] == '\n') {
string t = input.substr(start, i - start);
if (t.find('.') != string::npos) {
res = max(res, m[level] + (int)t.size());
} else {
++level;
m[level] = m[level - 1] + (int)t.size() + 1;
}
level = 0;
} else {
++level;
}
}
return res;
}
};