71. Simplify Path (Medium)

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".

这道题让简化给定的路径,光根据题目中给的那一个例子还真不太好总结出规律,应该再加上两个例子 path = "/a/./b/../c/", => "/a/c"和path = "/a/./b/c/", => "/a/b/c", 这样我们就可以知道中间是"."的情况直接去掉,是".."时删掉它上面挨着的一个路径,而下面的边界条件给的一些情况中可以得知,如果是空的话返回"/",如果有多个"/"只保留一个。那么我们可以把路径看做是由一个或多个"/"分割开的众多子字符串,把它们分别提取出来一一处理即可,代码如下:

Solution1: Stack

string simplifyPath(string path) {
    vector<string> v;
    int i = 0;

    while (i < path.size()) {
        while (i < path.size() && path[i] == '/') ++i;
        if (i == path.size()) break;
        string s;
        while (i < path.size() && path[i] != '/') s.push_back(path[i++]);

        if (s == "..") {
            if (!v.empty()) v.pop_back(); 
        } else if (s != ".") {
            v.push_back(s);
        }
    }
    string res;
    for (string s : v) res += "/" + s;
    return res.empty() ? "/" : res;
}

Solution2: use stingstream

string simplifyPath(string path) {
    string res, t;
    stringstream ss(path);
    vector<string> v;
    while (getline(ss, t, '/')) {
        if (t == "..") {
            if (!v.empty()) v.pop_back();
        } else if (t != "" && t != ".") {
            v.push_back(t);
        }
    }
    for (string s : v) res += "/" + s;
    return res.empty() ? "/" : res;
}

results matching ""

    No results matching ""