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

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

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

原创内容 转载请注明出处

分享给朋友:

相关文章

力扣70题:告别暴力递归!从零实现记忆化搜索解法

力扣70题:告别暴力递归!从零实现记忆化搜索解法

题意解析:想象你站在楼梯底部,面前有n级台阶。每次你可以选择跨1级或2级台阶,最终到达顶端的路径有多少种不同的走法?这个问题本质上是在探索分叉决策的叠加效果——当我们把每个台阶处的选择看作二叉树的分支...

力扣119题:从O(n²)到O(2n):杨辉三角高效空间优化

力扣119题:从O(n²)到O(2n):杨辉三角高效空间优化

题目重解:给定一个非负索引 rowIndex,返回杨辉三角的第 rowIndex 行。不同于生成整个杨辉三角,这道题要求我们只返回特定行,且空间复杂度应尽可能优化。例如输入3,需要返回[1,3,3,1...

NOIP2005 普及组 洛谷P1408 背包问题的空间优化技巧与实战应用

NOIP2005 普及组 洛谷P1408 背包问题的空间优化技巧与实战应用

题目重解想象你是一名药师,有t分钟在山上采集m种草药。每种草药需要time分钟采集,价值为num。这就像考试时分配时间做题,要选择收益最大的题目组合。题目要求计算在规定时间内能获得的最大草药价值。解题...

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

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

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

手把手教你实现头插法树:从代码到原理的深度解析

一、简介和特点头插法树是一种基于链表实现的树形数据结构,其核心思想是通过链表头插法管理节点的孩子节点。在本文的代码示例中,我们使用C++模板类实现了树结构,每个树节点(treenode<T>...

发表评论

访客

看不清,换一张

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