【LeetCode每日一题】388. 文件的最长绝对路径

139 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

LeetCode每日一题打卡专栏正式启动!不出意外将日更LeetCode的每日一题,敬请期待。

个人博客链接:bbstudy.net/ (等毕业论文做好后续会完善相关功能)

4.20:文件的最长绝对路径

LeetCode 388,点击题目即可跳转至LeetCode

题解:模拟

注意:题目给出的换行符\n\n和制表符\t\t,都只是字符,而不是由两个字符组成。

上述理解后,这题就不是很难了,对于每一个文件file:

  • 要么是由上一层的文件夹所得到,此时路径长度为:文件名长度+上一层路径长度+1(表示/)
  • 要么直接为根目录下的文件,此时路径长度直接为:文件名长度

判断当前遍历的为文件还是文件夹 ,于是只需要判断是否存在字符 .. 即可。

又由于只需要计算文件的最长绝对路径,于是我们只需要存储每一层的绝对路径的长度,然后按照上述规则不断更新结结果即可。

具体见下方代码注释。

C++代码:

class Solution {
public:
    int lengthLongestPath(string input) {
        int n=input.length();
        int ans=0;
        int pos=0;  //遍历字符串
        int dep;   //遍历文件的层数
        vector<int> f(n+1);  //记录每一层的路径长度
        while(pos<n){
            //当前层数
            dep=1;
            while(pos<n&&input[pos]=='\t'){
                pos++;dep++;
            }
            //记录当前文件/文件夹的长度
            int len=0;
            bool flag=false; //判断是否为文件
            while(pos<n&&input[pos]!='\n'){
                if(input[pos]=='.') flag=true;
                pos++;len++;
            }
            // 不是根目录
            if(dep>1) len+=f[dep-1]+1;
            if(flag){ //is file
                ans=max(ans,len);
            }else{ //is folder
                f[dep]=len;
            }
            //跳过换行符
            pos++;
        }
        return ans;
    }
};