当前位置:首页 > 力扣 > 力扣388题解析:最长绝对路径(栈+字符串处理优化解法)

力扣388题解析:最长绝对路径(栈+字符串处理优化解法)

3周前 (08-23)

力扣388题解析:最长绝对路径(栈+字符串处理优化解法) 力扣题解 栈应用 字符串处理 栈结构 第1张

一、题目解读

力扣第388题“最长绝对路径”要求从给定的文本中提取文件系统中目录与文件名的绝对路径,并返回其中最长的路径长度。输入为多行文本,每行由缩进('\t')表示层级,末尾以换行符分隔,文件名包含“.”标识。需处理层级关系,计算包含目录与文件名的完整路径长度,并找出最大值。

二、解题思路

采用“+字符串解析”的策略,核心思想是通过栈维护当前层级路径长度,利用缩进计算层级变化,动态调整栈结构,避免递归或复杂遍历。关键在于:

1. 通过统计每行开头的缩进数量确定层级;

2. 区分文件与目录,文件计入总长度,目录则更新栈;

3. 利用栈的先进后出特性,确保路径长度随层级变化正确累加。

三、解题步骤

1. 初始化:创建栈存储路径长度,初始为空路径(长度0),记录最大长度maxLen;

2. 逐行解析:

    统计缩进数确定当前层级level;

    解析文件名(含“.”标记为文件),记录名称长度nameLen;

    调整栈至当前层级:若栈内层级多于当前层级,弹出多余元素;

    计算当前路径总长度:文件则更新maxLen,目录则添加分隔符长度并入栈;

3. 循环结束:返回maxLen。

四、代码与注释

class Solution {
public:
    int lengthLongestPath(string input) {
        stack<int> pathLengths; // 存储各级路径长度
        pathLengths.push(0);    // 初始空路径
        int maxLen = 0;         // 记录最大长度
        size_t i = 0;
        
        while (i < input.size()) {
            // 1. 计算当前层级
            int level = 0;
            while (i < input.size() && input[i] == '\t') {
                ++level;
                ++i;
            }
            
            // 2. 提取当前文件/目录名
            bool isFile = false;
            int nameLen = 0;
            while (i < input.size() && input[i]!= '\n') {
                if (input[i] == '.') isFile = true;
                ++nameLen;
                ++i;
            }
            
            // 3. 调整栈到当前层级
            while (level + 1 < pathLengths.size()) {
                pathLengths.pop();
            }
            
            // 4. 计算当前路径总长度
            int currentLen = pathLengths.top() + nameLen;
            if (isFile) {
                maxLen = max(maxLen, currentLen);
            } else {
                currentLen += 1; // 添加路径分隔符'/'
                pathLengths.push(currentLen);
            }
            
            ++i; // 跳过换行符
        }
        
        return maxLen;
    }
};

注释说明:代码通过栈动态维护路径长度,利用缩进层级与文件名解析,避免深度遍历,提升效率。

五、总结

本题解法巧妙利用栈的特性处理层级关系,将递归结构转化为线性操作,显著降低时间复杂度。关键点在于:

1. 栈的层级同步:通过弹出多余元素保持栈顶与当前层级一致;

2. 文件与目录的区分处理:文件直接比较长度,目录则扩展路径;

3. 细节优化:如提前计算名称长度、跳过换行符等减少冗余操作。

该思路可扩展至类似文件系统解析场景,体现算法设计中“数据结构选择与问题特性结合”的核心思想。


原创内容 转载请注明出处

分享给朋友:

相关文章

【力扣2846题】图论+二进制提升:高效解决连通性问题(附C++代码)

【力扣2846题】图论+二进制提升:高效解决连通性问题(附C++代码)

一、题目解读力扣2846题要求解决一个基于图连通性的操作优化问题。给定一个无向图,包含边权重,以及一系列查询,每个查询询问两点间路径的最小操作次数。题目关键在于高效计算路径上权重分布的统计信息,并转化...

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

一、题目解读力扣LCR074题要求对给定的二维区间数组(每个区间由起始点和终止点构成)进行合并,将重叠的区间合并为更宽的区间,最终输出不重叠的合并结果。例如,输入[[1,3],[2,6],[8,10]...

力扣2588题解:利用前缀异或和与哈希表求解美丽子数组问题

力扣2588题解:利用前缀异或和与哈希表求解美丽子数组问题

一、题目解读力扣2588题要求计算给定数组中“美丽子数组”的数量。所谓“美丽子数组”,是指子数组的异或和为0。题目关键在于理解子数组异或和的性质,并通过高效算法统计符合条件的子数组数量。二、解题思路采...

LeetCode 1031题解析:不重叠子数组最大和的解法(前缀和+动态规划)

LeetCode 1031题解析:不重叠子数组最大和的解法(前缀和+动态规划)

一、题目解读LeetCode 1031题要求在不重叠的前提下,从给定数组nums中寻找两个长度分别为firstLen和secondLen的连续子数组,使其和最大。题目强调子数组必须不重叠,即两个子数组...

力扣1643题:第K小字典序路径(附C++代码与解题思路)

力扣1643题:第K小字典序路径(附C++代码与解题思路)

一、题目解读本题要求生成从原点(0, 0)到目标坐标(destination[0], destination[1])的路径中,字典序第K小的路径。路径仅由向下字符'V'(代表垂直移动)...

LeetCode 2466题解:统计构造好字符串的方案数(动态规划+模运算)

LeetCode 2466题解:统计构造好字符串的方案数(动态规划+模运算)

一、题目解读LeetCode 2466题要求统计在长度范围 [low, high] 内,由字符 '0' 和 '1' 构成的“好字符串”数量。好字符串定义为:每次可添加...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。