栈结构在文件路径问题中的妙用:力扣388题最长绝对路径详解
一、问题背景
力扣388题要求我们计算文件系统中文件的最长绝对路径长度。输入字符串使用\t
表示层级关系,\n
分隔不同文件/目录。例如:
"dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext"
表示目录结构:
dir/ subdir1/ subdir2/ file.ext
二、核心思路
使用栈结构维护当前路径的累计长度,通过以下4个关键步骤处理每个文件/目录:
层级计算:通过
\t
数量确定当前项所处层级名称提取:记录名称长度并检测文件扩展名
栈调整:保持栈内只保留当前路径的祖先节点
长度计算:文件则更新最大值,目录则入栈备用
三、完整实现代码(带注释)
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; } };
四、关键点解析
栈的初始化:初始压入0处理根目录情况
层级控制:
level+1 < stack.size()
确保栈深与当前层级匹配路径分隔符:目录需要额外+1计入
/
的长度时间复杂度:O(n)单次遍历,每个字符只处理一次
五、实际案例演示
以输入"dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext"
为例:
处理
dir
时栈变为[0,4]处理
subdir1
时栈变为[0,4,8]遇到
file1.ext
时计算长度12最终得到最长路径长度32
六、总结
该解法巧妙利用栈结构:
天然处理目录的嵌套关系
通过出栈操作实现目录回溯
空间复杂度O(d)(d为最大深度)
可扩展处理更复杂的路径规则
原创内容 转载请注明出处