G家的一道面試題主守。這道題重點(diǎn)是通過split by '\n', 橫向轉(zhuǎn)化為縱向禀倔。利用 '\t' 的個(gè)數(shù)來建立層次。
參考:http://www.cnblogs.com/grandyang/p/5806493.html
dir
subdir1
subdir2
file.ext
建立unordered_map<int, int> 層次参淫,與長度的映射關(guān)系救湖。
這道題值得注意的一點(diǎn)是:如果不討論起始level = 0 (既find_last_of('\t') == string::npos) 也可以做,重點(diǎn)如下
- c++ string find last of, 如果沒找到涎才,便返回string::npos, 這個(gè)值換成int 就是 -1
- 對于c++ unordered_map而言,如果key不存在耍铜,返回0.
map[-100] = 0; - 注意如果file_name找不到'.', 表示subdirectory邑闺,需要及時(shí)更新該subdirectory的實(shí)時(shí)長度,而并不是取max, 因?yàn)樵搶觤ax的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;
}
};