30.哀家要长脑子了!---栈与队列

1.388. 文件的最长绝对路径 - 力扣(LeetCode)

其实看懂了就还好

用一个栈来保存所遍历过最大的文件的绝对路径的长度,栈顶元素是文件的长度,栈中元素的个数是该文件目录的深度,非栈顶元素就是当时目录的长度

检查此时所所遍历的目录的深度,看有多少个 "\t",因为根目录是第一级,所以深度从1开始计算而不是从0开始计算

再来判断文件的长度,遇到 "\n",就代表文件遍历完了,要换一层目录,遇到pos > n说明遍历完辣

然后检查一下之前有没有遍历过深度更大的文件,写的时候这里半天没搞懂,报一丝

具体用 st.size() 与 depth 之间的大小关系判断,如果st.size() >= depth 说明曾经遍历过深度更大的文件。

等一下,我又发现我理解错了,这个栈的作用不是我所理解的保存文件绝对路径的长度,他是用来帮助计算此时所遍历到的文件的长度,然后每次更新ans值记录最大的长度。

怎么正确计算呢,话接上文,曾经遍历过深度更大的目录或文件,说明此时所遍历的文件或者是此时所在的目录发生了路径跳转,不是那个深度更大的目录或是文件了,栈中包含的不必要的更深层的长度信息,但是我们要计算的是此时所在文件或是目录的路径长度。所以就回退,回退到上一级目录,也是它俩的共同父亲目录,去计算长度信息。

复制代码
class Solution {
public:
    int lengthLongestPath(string input) {
        int n = input.size();
        int pos = 0, ans = 0;
        stack<int> st;
        while(pos < n){
            // 统计当前文件深度
            int depth = 1;
            while(pos < n && input[pos] == '\t'){
                depth++, pos++;
            }
            //统计文件夹的长度
            int len = 0;
            bool flag = false;
            while(pos < n && input[pos] != '\n'){
                if(input[pos] == '.'){
                    flag = true;
                }
                pos++, len++;
            }
            //跳过换行符
            pos++;
            //计算长度
            if(st.size() >= depth){
                st.pop();
            }
            //加上前面的目录路径
            if(!st.empty()){
                len += st.top() + 1;
            }
            if(flag)
                ans = max(ans, len);
            st.emplace(len);
        }
        return ans;
    }
};
相关推荐
学习星球6 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
血小板要健康9 小时前
网格 dfs 与 FloodFill:从岛屿、区域到搜索路径
笔记·算法·leetcode·深度优先
鹿角片ljp13 小时前
LeetCode 141. 环形链表|从 HashSet 到快慢指针 O (1) 空间最优解
算法·leetcode·链表
ZC跨境爬虫15 小时前
LeetCode 219. 存在重复元素 II(滑动窗口 + 哈希表详解)
算法·leetcode·散列表
Navigator_Z15 小时前
LeetCode //C - 1220. Count Vowels Permutation
c语言·算法·leetcode
feilieren16 小时前
leetcode - 389. 找不同
算法·leetcode
evans在进步16 小时前
LeetCode 238 除自身以外数组的乘积:前缀积与后缀积详解
算法·leetcode·职场和发展
刃神太酷啦1 天前
Linux 系统 MySQL 完整安装配置教程:从卸载 MariaDB 到优化 my.cnf----《Hello MySQL!》(1)
android·linux·c语言·c++·mysql·leetcode·mariadb
wenyq71 天前
LeetCode 2904. Shortest and Lexicographically Smallest Beautiful String
算法·leetcode
_Narcissus_1 天前
分治&递归
数据结构·c++·笔记·算法·leetcode·递归·分治