252、文件的最长绝对路径

题目描述:
假设我们以下述方式将我们的文件系统抽象成一个字符串:

字符串 “dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext” 表示:

dir
subdir1
subdir2
file.ext
目录 dir 包含一个空的子目录 subdir1 和一个包含一个文件 file.ext 的子目录 subdir2 。

字符串 “dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext” 表示:

dir
subdir1
file1.ext
subsubdir1
subdir2
subsubdir2
file2.ext
目录 dir 包含两个子目录 subdir1 和 subdir2。 subdir1 包含一个文件 file1.ext 和一个空的二级子目录 subsubdir1。subdir2 包含一个二级子目录 subsubdir2 ,其中包含一个文件 file2.ext。

我们致力于寻找我们文件系统中文件的最长 (按字符的数量统计) 绝对路径。例如,在上述的第二个例子中,最长路径为 “dir/subdir2/subsubdir2/file2.ext”,其长度为 32 (不包含双引号)。

给定一个以上述格式表示文件系统的字符串,返回文件系统中文件的最长绝对路径的长度。 如果系统中没有文件,返回 0。

说明:

文件名至少存在一个 . 和一个扩展名。
目录或者子目录的名字不能包含 .。
要求时间复杂度为 O(n) ,其中 n 是输入字符串的大小。

请注意,如果存在路径 aaaaaaaaaaaaaaaaaaaaa/sth.png 的话,那么 a/aa/aaa/file1.txt 就不是一个最长的路径。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-absolute-file-path
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    public int lengthLongestPath(String input) {
        input = input.replace("\n    ","\n\t");
        //增加/路径,方便后面计算字符串大小
        input = input.replace("\n\t","/\n\t");
        String[] strs = input.split("\n");
        int t_count = 0;
        String tempStr = "",theBestLongStr = "";
        for(int i=0;i< strs.length;i++){
            int now_t_count = strs[i].length() -  strs[i].replace("\t","").length();
            if(now_t_count > t_count || now_t_count == 0){
                tempStr = now_t_count > t_count ? tempStr + strs[i]:strs[i];
            } else {
                String t_str = "";
                for(int j=1; j<=now_t_count;j++){
                    t_str += "\t";
                }
                String[] arg = tempStr.split(t_str);
                tempStr = arg[0] + strs[i];
            }
            //只有文件路径会被记录下来
            if(strs[i].contains(".")){
                if(tempStr.endsWith("/")){
                    tempStr = tempStr.substring(0,tempStr.length() - 1);
                }
                if(theBestLongStr.equals("") || tempStr.replace("\t","").length() > theBestLongStr.replace("\t","").length()){
                    theBestLongStr = tempStr;
                }
            }
            t_count = now_t_count;
        }
        //最后一个文件路径对比
        tempStr = tempStr.replace("\t","");
        theBestLongStr = theBestLongStr.replace("\t","");
        if(tempStr.contains(".") && tempStr.length() > theBestLongStr.length()){
            return tempStr.length();
        }
        return theBestLongStr.length();
    }
}

额这个代码比较简单

class Solution {
    public int lengthLongestPath(String input) {
        if (input == null || input.length() == 0) return 0;
        
        String[] dirs = input.split("\n");
        
        int[] len = new int[dirs.length + 1];
        int res = 0;
        for (String dir: dirs) {
            int numOfTabs = dir.lastIndexOf("\t") + 1;
            int level = numOfTabs + 1;
            // len[curLevel] = len[preLevel] + dir.length() - numOfTabs;
            len[level] = len[level - 1] + dir.length() - numOfTabs + 1;
            if (dir.contains("."))
                res = Math.max(res, len[level] - 1);
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值