美文网首页
71. Simplify Path

71. Simplify Path

作者: RobotBerry | 来源:发表于2017-05-10 20:18 被阅读0次

问题

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

例子

path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"

分析

首先要明确下面几个规则:

  • 路径末尾的/可以删除;
  • ./指的是当前路径,可以删除;
  • ../指的是上一级路径,/a/b/../相当于/a;
  • /../可以被缩减为/。

方法一

首先实现一个string的split方法,把字符串根据'/'分各个成若干字符串。创建一个栈stk,遍历分割后的字符串s:

  • 如果s是.,忽略,直接遍历下一个字符串;
  • 如果s是..并且栈不为空,将栈顶弹出;
  • 否则将字符串入栈。

最后逆序输出栈的元素,并且用/分割,即可得到简化后的路径。栈可以用vector来模拟,这样就可以直接顺序访问元素了,不需要一个一个弹出再逆序输出。

方法二

用string的getline方法来分割字符串

要点

  • 字符串分割

时间复杂度

O(n)

空间复杂度

O(n)

代码

方法一

class Solution {
public:
    string simplifyPath(string path) {
        vector<string> strs;
        split(path, "/", strs);
        vector<string> simplifiedStrs;
        for (const string &str : strs) {
            if (str == "" || str == ".") continue;
            else if (str == "..") {
                if (!simplifiedStrs.empty())
                    simplifiedStrs.pop_back();
            }
            else simplifiedStrs.push_back(str);
        }
        string simplifiedPath;
        for (const string &str : simplifiedStrs)
            simplifiedPath += "/" + str;
        if (simplifiedPath.empty())
            simplifiedPath = "/";
        return simplifiedPath;
    }
    
private:
    void split(const std::string &s, const std::string &delim, std::vector<std::string> &res) {  
        size_t last = 0;  
        size_t index = s.find_first_of(delim, last);  
        while (index != std::string::npos) {  
            res.push_back(s.substr(last, index - last));  
            last = index+1;  
            index = s.find_first_of(delim, last);  
        }  
        if (index-last > 0)  
            res.push_back(s.substr(last, index - last));  
    }
};

方法二

class Solution {
public:
    string simplifyPath(string path) {
        string res, tmp;
        vector<string> stk;
        stringstream ss(path);
        while (getline(ss, tmp, '/')) {
            if (tmp == "" || tmp == ".") continue;
            if (tmp == ".." && !stk.empty()) stk.pop_back();
            else if (tmp != "..") stk.push_back(tmp);
        }
        for (const auto &str : stk) res += "/" + str;
        return res.empty() ? "/" : res;
    }
};

相关文章

网友评论

      本文标题:71. Simplify Path

      本文链接:https://www.haomeiwen.com/subject/leogtxtx.html