Leetcode 71 Simplify Path

本文深入探讨了Unix风格文件系统的路径简化算法,通过实例解析如何处理绝对路径中的符号.和..,并提供了详细的代码实现。文章还讨论了特殊情况,如路径中出现连续的斜杠以及/../的情况,确保读者能够全面理解并掌握路径简化的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given an absolute path for a file (Unix-style), simplify it. 

For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"
path = "/a/../../b/../c//.//", => "/c"
path = "/a//b////c/d//././/..", => "/a/b/c"

In a UNIX-style file system, a period ('.') refers to the current directory, so it can be ignored in a simplified path. Additionally, a double period ("..") moves up a directory, so it cancels out whatever the last directory was. For more information, look here: https://en.wikipedia.org/wiki/Path_(computing)#Unix_style

Corner Cases:

  • Did you consider the case where path = "/../"?
    In this case, you should return "/".
  • Another corner case is the path might contain multiple slashes '/' together, such as "/home//foo/".
    In this case, you should ignore redundant slashes and return "/home/foo".

这个题的意思是仿照Unix的路径规划来进行模拟

class Solution {
public:
    string simplifyPath(string path) {
        path += '/';//首先加上'/'以简化操作
        string res,s;
        for(auto c : path){
            if(res.empty()){//res为实际的串
                res += c;
            }else if(c != '/'){//读入正常的串(两个'/'之间的串)
                s += c;
            }else{
                if(s == ".."){
                    if(res.size() > 1){
                        res.pop_back();
                    }
                    while(res.back() != '/'){//连续退,主要是在两个'/'为一段很长的串的时候
                        res.pop_back();
                    }
                }else if(s != "" && s != "."){//正常添加
                    res += s + '/';
                }
                s = "";//将这个串清零
            }
        }
        if(res.size() > 1){
            res.pop_back();//去掉'/'
        }
        return res;
    }
};

 

### LeetCode Problem 71 Simplify Path Problem 71 on LeetCode is titled "Simplify Path," which involves simplifying a given Unix-style path to its canonical form. The task does not directly involve stacks as the primary data structure, but one can implement solutions that utilize stack-like behavior or other methods. The goal of this problem is to convert an absolute path into its simplest and most normalized form by resolving `..` (parent directory), `.` (current directory), and multiple slashes (`//`). For instance: - Input: `/home/` - Output: `/home` A common approach uses string manipulation techniques rather than explicitly implementing a stack from scratch like in some problems such as those mentioned in another context[^2]. However, understanding how paths are processed could be analogous to operations performed when managing elements within a stack where directories might be pushed onto or popped off depending on whether they represent moving up or down through filesystem levels. For solving this particular challenge without focusing specifically on traditional stack implementation details found elsewhere [^3]: ```cpp #include <iostream> #include <sstream> #include <vector> using namespace std; string simplifyPath(string path) { stringstream ss(path); vector<string> tokens; string token, res = "", prev; while(getline(ss,token,'/')){ if(token==".." && !tokens.empty()) tokens.pop_back(); else if((!token.empty())&&(token!=".")&&(token!="..")) tokens.push_back("/"+token); } for(auto& s : tokens){ res += s; } return res.empty()? "/":res; } ``` This code snippet demonstrates handling various cases including consecutive slashes, current-directory symbols `.`, parent-directory symbols `..`. It iterates over parts split by slash characters, applying rules similar to pushing valid segments onto a list (acting similarly to a stack's functionality) and popping them upon encountering double dots indicating upward traversal beyond root level isn't possible thus ignored implicitly during construction phase only adding non-empty strings representing actual traversals back together forming final simplified result.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值