Longest Absolute File Path (Leetcode 388)

G家的一道面试题。这道题重点是通过split by '\n', 横向转化为纵向。利用 '\t' 的个数来建立层次。

参考:http://www.cnblogs.com/grandyang/p/5806493.html

dir
    subdir1
    subdir2
        file.ext

建立unordered_map 层次,与长度的映射关系。
这道题值得注意的一点是:如果不讨论起始level = 0 (既find_last_of('\t') == string::npos) 也可以做,重点如下

  1. c++ string find last of, 如果没找到,便返回string::npos, 这个值换成int 就是 -1
  2. 对于c++ unordered_map而言,如果key不存在,返回0.
    map[-100] = 0;
  3. 注意如果file_name找不到'.', 表示subdirectory,需要及时更新该subdirectory的实时长度,而并不是取max, 因为该层max的subdirectory可能没有file。这就是为什么
mp[lvl] = mp[lvl-1] + (int)file_name.length() + 1;
而不是
mp[lvl] = max(mp[lvl], mp[lvl-1] + (int)file_name.length() + 1);
class Solution {
public:
    int lengthLongestPath(string input) {
        if(input.empty()) return 0;
        istringstream ssi(input);
        string token;
        unordered_map mp;
        int max_len = 0;
        while(getline(ssi, token)){
            int lvl = token.find_last_of('\t');
            string file_name = token.substr(lvl+1);
            if(file_name.find('.') != string::npos){
                max_len = max(max_len, mp[lvl-1] + (int)file_name.length());
            }else{
                mp[lvl] = mp[lvl-1] + (int)file_name.length() + 1;
            }
        }
        return max_len;
    }
};

你可能感兴趣的:(Longest Absolute File Path (Leetcode 388))