写在前面:
选取题目388,采用深度优先搜索解决问题。
题意解读:这道题给了我们一个字符串,里面包含\n和\t这种表示回车和空格的特殊字符,让我们找到某一个最长的绝对文件路径。
解题思路:可以用哈希表来建立深度和当前深度的绝对路径长度之间的映射,那么当前深度下的文件的绝对路径就是文件名长度加上哈希表中当前深度对应的长度,我们的思路是遍历整个字符串,遇到\n或者\t就停下来,然后我们判断,如果遇到的是回车,我们把这段文件名提取出来,如果里面包含'.',说明是文件,我们更新res长度,如果不包含点,说明是文件夹,我们深度level自增1,然后建立当前深度和总长度之间的映射,然后我们将深度level重置为0。之前如果遇到的是空格\t,那么我们深度加一,通过累加\t的个数,我们可以得知当前文件或文件夹的深度,然后做对应的处理。
代码:
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;
}
};