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

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

5个月前 (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;
    }
};

原创内容 转载请注明出处

分享给朋友:

相关文章

手搓双向链表代码全解析:从零开始实现双向链表数据结构(附注释与实战步骤)

一、简介和特点双向链表(Double Linked List)是一种基础的数据结构,它由多个节点组成,每个节点包含数据域、指向下一个节点的指针(next)和指向前一个节点的指针(last)。与单向链表...

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

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

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

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

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

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

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

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

一、题目解读洛谷1220题要求计算在n个位置放置灯的情况下,通过关闭连续区间灯并移动至区间端点,使得总耗电量最小。需考虑灯的功率与位置差异,设计高效的算法求解最优策略。二、解题思路1. 动态规划 +...

发表评论

访客

看不清,换一张

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