1. 解析
题目大意,求解最长的文件路径。
2. 分析
参考@Grandyang的博客,该题的难点在于如何记录当前的目录深度和对应的目录长度,字符串由'a-z','.','\n','\t'4种不同的字符组成,'.'代表当前为文件,换行符'\n'代表下一层目录开始的标记,空格符'\t'表示目录的深度,为避免重复检测,用hashmap记录当前目录的深度和对应的目录长度,每一层的状态只有两种,文件或者目录,所以每次我们一直检测到'\n'或者'\t',之前的即为目录或文件名,若为'\n',判断之前的是目录还是文件名,若为文件名,更新最大长度,若为目录,则记录当前深度和对应的长度。
例如:"dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext",为方便查看,将layer_to_file中的value值替换成了具体的字符串,实则为它所对应的长度。
检测"dir",下一个字符为'\n',当前不是文件,建立当前目录和深度的关系,即layer_to_file = [1, "dir/"]
往下检测'\t',层数layer = 1,检测"subdir1",下一个字符为'\n',当前不是文件,建立当前目录和深度的关系,
即layer_to_file = [1, "dir/"],[2, "dir/subdir1/"]
.....
class Solution {
public:
int lengthLongestPath(string input) {
if (input.empty() || input.find('.') == string::npos) return 0;
unordered_map<int, int> layer_to_len{{0, 0}};
int res = 0;
int start = 0, layer = 0;
for (int i = 0; i < input.length(); ++i){
start = i;
while (i < input.length() && input[i] != '\n' && input[i] != '\t') ++i;
if (i >= input.length() || input[i] == '\n'){
string str = input.substr(start, i - start); //获取目录名或者文件名
if (str.find('.') != string::npos){ //当前为文件,则更新
res = max(res, layer_to_len[layer] + (int)str.length());
}
else{ //当前为目录,记录当前目录深度和对应的长度
layer_to_len[layer + 1] = layer_to_len[layer] + (int)str.length() + 1; //以'/'划分目录,所以要加上1
}
layer = 0;
}
else{ //检测到'\t',深度加1
layer++;
}
}
return res;
}
};