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

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

1周前 (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级台阶,最终到达顶端的路径有多少种不同的走法?这个问题本质上是在探索分叉决策的叠加效果——当我们把每个台阶处的选择看作二叉树的分支...

70.爬楼梯|三步破解动态规划核心奥秘

70.爬楼梯|三步破解动态规划核心奥秘

题意新解:站在楼梯底仰望n级台阶,每步可选1或2阶,最终的路径组合犹如斐波那契数列般展开。比如到达第3阶的路径可由第1阶跨两步,或第2阶跨一步构成,这种递推规律揭示了两两相邻状态间的紧密关联。思路解析...

力扣LCR182:字符串操作三连 从基础拼接到底层指针优化

力扣LCR182:字符串操作三连 从基础拼接到底层指针优化

题目重解需要将密码字符串从第target个字符开始进行重新排列,形成新的动态密码。例如输入"password"和target=3,结果应为"swordpas"。...

力扣740.删除并获得点数 预处理与动态规划的巧妙融合

力扣740.删除并获得点数 预处理与动态规划的巧妙融合

题意解析:给定一组数字,每当你选择一个数字x时,所有等于x-1和x+1的数字都会被自动移除。你需要通过巧妙的选择顺序,最大化获得的点数总和。这个问题可以转化为对离散化数字分布的动态规划问题——将相邻数...

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

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

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

力扣第92题:三步定位 精准反转链表指定区间

力扣第92题:三步定位 精准反转链表指定区间

题目解读给定一个单链表和两个整数left与right,要求将链表中从第left个节点到第right个节点的部分进行反转,而保持其他部分不变。例如,对于链表1→2→3→4→5,left=2,right=...

发表评论

访客

看不清,换一张

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