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

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

5天前

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

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


原创内容 转载请注明出处

分享给朋友:

相关文章

牛客13271题「删除K个数字的最小数」解题报告:贪心算法与栈的应用(附代码注释)

牛客13271题「删除K个数字的最小数」解题报告:贪心算法与栈的应用(附代码注释)

一、题目解读牛客13271题要求从给定的数字字符串中删除K个数字,使得剩余数字按原顺序排列后得到的最小数。题目核心在于如何在保持数字相对顺序的前提下,通过删除操作得到最优解。需注意结果字符串可能包含前...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

发表评论

访客

看不清,换一张

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