LeetCode--71. Simplify Path

题目链接:https://leetcode.com/problems/simplify-path/

题意比较复杂难懂,但多看几遍例子就差不多了。文件夹目录的目录名的层次关系用"/"分隔,"."表示当前文件夹,".."表示从当前文件夹回退到父文件夹,而字母表示的是文件夹的名字,关键信息就是这些,还要注意一些corner cases,问题中已经给出提示了。这里的难点就是这个回退到父文件夹,这里可以用栈这种数据结构来做,最终从栈顶到栈底存储的就是从子文件夹到父文件夹的名字了,这里还需要借用一个栈来将顺序恢复成从父文件夹到子文件夹,这里我们是使用双端队列(deque),Java中的双端队列是基于链表或顺序表来实现的,算法代码如下:

class Solution {
    public static String simplifyPath(String path) {

        String[] strs=path.split("\\/");

        Deque<String> deq=new LinkedList<>();

        for(String str:strs)
        {
            if(str.equals("") || str.equals("."))
                continue;
            else if(str.equals(".."))
                deq.pollLast();
            else
                deq.add(str);
        }

        if(deq.isEmpty())
            return "/";
        StringBuilder sb=new StringBuilder();
        while(!deq.isEmpty())
        {
            sb.append('/').append(deq.pollFirst());
        }
        return sb.toString();
    }
}

 

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

余额充值