G家的一道面试题。这道题重点是通过split by '\n', 横向转化为纵向。利用 '\t' 的个数来建立层次。
参考:http://www.cnblogs.com/grandyang/p/5806493.html
dir
subdir1
subdir2
file.ext
建立unordered_map<int, int> 层次,与长度的映射关系。
这道题值得注意的一点是:如果不讨论起始level = 0 (既find_last_of('\t') == string::npos) 也可以做,重点如下
- c++ string find last of, 如果没找到,便返回string::npos, 这个值换成int 就是 -1
- 对于c++ unordered_map而言,如果key不存在,返回0.
map[-100] = 0; - 注意如果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<int, int> 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;
}
};