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

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 和一個空的二級子目錄 subsubdir1subdir2 包含一個二級子目錄 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;
    }
};