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

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

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

原创内容 转载请注明出处

分享给朋友:

相关文章

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

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

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

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

手搓二叉搜索树代码详解:从入门到实现(附完整注释)

一、简介和应用二叉搜索树(Binary Search Tree,BST)是一种经典的数据结构,其特点在于每个节点的左子树所有节点值均小于该节点,右子树所有节点值均大于该节点。这种特性使得它在查找、插入...

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

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

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

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

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

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

LeetCode 537题解:复数乘法的C++高效实现与代码解析

LeetCode 537题解:复数乘法的C++高效实现与代码解析

一、题目解读LeetCode 537题要求实现两个复数的乘法,输入为形如"a+bi"的字符串,需输出乘积的复数形式。题目核心在于解析字符串中的实部与虚部,并应用复数乘法公式计算结果...

发表评论

访客

看不清,换一张

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