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;
}