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"
click to show corner cases.
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".


分析如下:

在解析到"./"的时候可以把它自己消除掉。

在解析到"../"的时候可以把当前读入路径的的一层消除掉, 所以题目需要使用stack的来按照从旧到新的顺序维护当前读入的路径, 从而在需要消除的时候消除栈顶。

首先,root 符号“/”作为一个单位入stack。

然后依次解析原串,比如 path = "/a/./b/../../c/", => "/c", 依次入栈 "/", "a", "b" , 出栈"b", 出栈“a”,入栈 "c"。

注意需要特别处理一下,上面的corner case。如果输入"/../",则返回root.


我的代码:

class Solution {
public:
    string simplifyPath(string path) {
        int start = 0;
        int end = 0;
        string result = "";
        stack<string> stack;
        if (path == "") return "";
        stack.push("/");
        while (start < path.length()) {
            while (start < path.length() && path[start] == '/') 
                start++; //start-1为最后一个'/'字符
            end = start; 
            while (end < path.length() && path[end] != '/')
                end++;  // end-1 为最后一个非'/'字符 
            string each = path.substr(start, end - start);
            if (each == "..") {
                if (stack.top() != "/")
                    stack.pop();
            } else if (each != "." && each != ""){
                stack.push(each);
            }
            start = end;
        }
        if (stack.size() == 1) return stack.top(); //return only the root, for some corner case.
        while (stack.size() > 1) {
            result = "/" + stack.top() + result;
            stack.pop();
        }
        return result;
    }
};


### 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、付费专栏及课程。

余额充值