LeetCode——388.文件的最长绝对路径

大佬,牛!!!

  • 题目:就是给你一个字符串,然后里面其实表示的是一个文件夹下面的所有文件,包括其路径,其中\n配合\t表示下一级的文件,\t有两个,其实就是已经到了3级目录了。然后要求我们找到一个文件路径,也就是说,最好访问的是一个文件,要求这个路径是的字符串个数是最多的。其中文件夹与文件夹之间需要一个/进行拼接的。
  • 我的思路:我的思路比较乱,首先是多层以后,需要回到前面一层,如何进行判断,还有就是前面一层的已有路径长度怎么存储等等。应该是一个递归,但是已知不知道从哪下手。而且我误认为\n和\t都是两个字符了,其实是一个字符。
  • 大佬的思路:跟我的差不多用一个栈保存了每一层的长度,然后会有变量来记录每一层的深度。换句话说,栈中存储的东西就是到本层级的长度。然后层级数就是通过\t的个数进行判断的。并且在对本层级进行探索的时候,还要看是不是文件,如果是文件,才有可能对最终结果进行替换。
  • 技巧:深度优先遍历,然后用一个栈存储每一层已知的深度。

伪代码

首先是定义一个变量pos,其实就是字符串的下标
定义一个栈
while循环,条件为pos小于字符串的长度
    首先我们需要判断这是第几层,也就是 通过/t的个数进行判断,统计到depth中,这时候pos也是++的,
    然后就是这一层的长度了len,只要不是\n就表示还在这一层,并且这里需要判断一下有没有'.',因为这是文件的标志
    然后pos++,因为上面的循环是pos指向的字符不是\n,那么退出的条件为是\n,则这时候pos指向的\n,所以还要++
    然后就是深度和栈的大小比较了,这个很关键,因为我们层数可能会骤减,栈的大小其实就是我们已经访问到的层级数。这时候要出栈了。
    然后就是栈不为空,len=当前深度加栈顶深度加1即可
    然后如果是文件就与旧的ans比较,拿到最大的替换ans。
    否则的话,就将len入栈,因为文件会在下一层。

java代码

class Solution {
    public int lengthLongestPath(String input) {
        int n = input.length();
        int pos = 0;// 当前位置,就是一个下标
        int ans = 0;// 返回结果
        Stack<Integer> stack = new Stack<>();

        while (pos < n) {
            int depth = 1;
            // 有多少个\t再+1就表示深度是多少
            while (pos < n && input.charAt(pos) == '\t') {// 注意,这里的\t时一个字符
                // 深度要+1
                depth++;
                pos++;
            }
            // 到了下一层了,看看下一层是不是文件,因为我们最终统计的是文件
            boolean isFile = false;
            int len = 0;// 统计长度是多少
            while (pos < n && input.charAt(pos) != '\n') {
                if (input.charAt(pos) == '.') {
                    isFile = true;
                }
                len++;
                pos++;
            }
            // 这时候需要跳过这个\n
            pos++;
            while (stack.size() >= depth) {// 层级数减小了
                stack.pop();
            }
            if (!stack.isEmpty()) {
                len += stack.peek() + 1;// 已有的深度,加上当前的深度再+1
            }
            if (isFile) {
                ans = Math.max(ans, len);
            } else {// 不是文件,就入栈
                stack.push(len);
            }
        }
        return ans;
    }
}
  • 总结:题目比较有意思,特别是\t和\n确实分别表示一个字符,这个一定要搞清楚。然后其他的其实不难,主要是可能稍微麻烦一点。最后附上大佬链接。

你可能感兴趣的:(算法,算法,java,leetcode)