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

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

2个月前 (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. 细节优化:如提前计算名称长度、跳过换行符等减少冗余操作。

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


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣2390题:移除字符串中的星号 - 栈模拟解法详解

力扣2390题:移除字符串中的星号 - 栈模拟解法详解

内容简介本文详细解析了力扣2390题"移除字符串中的星号"的高效解法。通过模拟栈操作处理字符串中的星号字符,实现了删除星号及其前一个字符的功能。文章包含完整注释代码、算法思路讲解和...

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

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

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

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

一、题目解读力扣面试题02.05要求将两个链表表示的整数相加,每个节点存储一位数字(逆序),结果同样以链表形式返回。例如,链表1为7→2→4,链表2为5→6→3,相加结果应为2→9→8→7。题目难点在...

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

一、题目解读LeetCode 2523题要求在一个给定的整数区间 [left, right] 内,找到间隔最小的两个质数(即相邻质数的差值最小),并返回这对质数。若区间内不存在两个质数,则返回 [-1...

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

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

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

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

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

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

发表评论

访客

看不清,换一张

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