Longest Absolute File Path

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;
    }
};

3. 类似的题目 

Flatten Nested List Iterator

Mini Parser

 [1]https://www.cnblogs.com/grandyang/p/5806493.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值