当前位置:首页 > 力扣 > 力扣第71题:用栈轻松解决Unix路径简化问题

力扣第71题:用栈轻松解决Unix路径简化问题

3个月前 (05-20)

力扣第71题:用栈轻松解决Unix路径简化问题 C++ 数据结构 字符串 力扣 栈 迭代 第1张

题目解读:

在Unix风格的文件系统中,我们经常需要处理各种复杂的路径表示。给定一个绝对路径字符串,我们需要将其转换为最简化的规范路径。规范路径要求:路径始终以斜杠'/'开头;两个目录名之间必须只有一个斜杠'/';不能包含'.'(表示当前目录)或'..'(表示上级目录)这样的特殊符号,除非它们确实表示路径结构;路径末尾不能有斜杠(根目录除外)。例如,将"/a/./b/../../c/"简化为"/c"。


解题思路与过程:

1.用的结构来处理路径简化问题。从路径的第二个字符开始遍历(因为第一个字符必定是'/'),逐个字符构建临时字符串tmp。每当遇到'/'或到达字符串末尾时,就对tmp中存储的路径片段进行处理。

2.对于".."操作,需要弹出栈顶元素(如果栈不为空),相当于返回上一级目录;对于"."或空字符串则直接忽略;其他合法目录名则压入栈中。遍历完成后,如果栈为空则返回根目录"/",否则将栈中元素按顺序拼接成规范路径。


代码与注释:

class Solution {
public:
    string simplifyPath(string path) {
        stack<string> s;  // 使用栈存储路径的有效目录名
        string str="";    // 最终结果字符串
        string tmp="";    // 临时存储当前处理的路径片段
        
        // 从第二个字符开始遍历(第一个字符必定是'/')
        for(int i=1;i<path.size();i++) {
            // 遇到'/'或到达字符串末尾时处理当前路径片段
            if(path[i]=='/' or i==path.size()-1) {
                // 如果当前字符不是'/',将其加入临时字符串
                if(path[i]!='/') {
                    tmp+=path[i];
                }
                
                // 处理".."情况:弹出栈顶目录(返回上一级)
                if(tmp=="..") {
                    if(!s.empty()) {
                        s.pop();
                    }
                }
                // 处理有效目录名:压入栈中
                else if(tmp!="." and tmp!="") {
                    s.push(tmp);
                }
                
                tmp=""; // 重置临时字符串
            }
            else {
                tmp+=path[i]; // 构建当前路径片段
            }
        }
        
        // 处理空栈情况(直接返回根目录)
        if(s.empty()) return "/";
        
        // 将栈中目录名按顺序拼接成规范路径
        while(!s.empty()) {
            str="/"+s.top()+str;
            s.pop();
        }
        
        return str;
    }
};

原创内容 转载请注明出处

分享给朋友:

相关文章

力扣933题:队列的妙用:如何高效统计最近请求

力扣933题:队列的妙用:如何高效统计最近请求

题目重解:我们需要设计一个能统计最近3000毫秒内请求次数的系统。每当新的请求到来时,它会带有时间戳t,我们需要返回过去3000毫秒内(包括当前)发生的请求总数。这就像是在时间轴上维护一个滑动窗口,只...

力扣965题深度解析:单值二叉树的判断技巧

力扣965题深度解析:单值二叉树的判断技巧

重新解读题目 判断一棵二叉树是否为“单值二叉树”,即所有节点的值是否完全相同。题目看似简单,实则考验对树结构递归特性的理解。若一棵树的所有节点值相同,其必然满足:根节点与左右子树的值一致,且...

力扣540题:线性扫描法如何高效定位唯一数

力扣540题:线性扫描法如何高效定位唯一数

题目重解一个严格递增的有序数组中,除某个元素外,其余每个元素均出现两次。这个看似简单的条件背后隐藏着巧妙的规律——单一元素会打破数组的"成对对称性"。题目要求以O(log n)时间...

手搓顺序表类代码注释与详解:从零实现动态数组(新手教程)

一、简介和特点顺序表(Sequential List)是数据结构中基础的一种线性表,其特点是将数据元素存储在连续的内存空间中。通过数组实现,支持随机访问(即通过索引直接访问元素),适用于频繁随机读取的...

牛客14496题解:括号最大深度问题(栈思想与代码优化)

牛客14496题解:括号最大深度问题(栈思想与代码优化)

一、题目解读牛客14496题要求计算给定括号字符串中的最大深度。例如,对于字符串 "(()())",最大深度为2。题目考察对括号嵌套结构的理解,以及如何通过编程找到最深嵌套层次。二...

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

一、题目解读洛谷1184题要求处理一组地点列表与行程记录,统计其中匹配的天数。题目难点在于高效处理带有空格的字符串输入,以及快速判断每日行程是否在高手可去地点集合中。需要兼顾输入格式解析与算法效率。二...

发表评论

访客

看不清,换一张

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