1. 题目描述
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”.
2. 解题思路
这是一道字符串的处理问题, 拿到这个问题, 首先想到的使用栈结构进行处理, 而且通过分析, 我们知道, 我们所需要处理的内容主要分为 4 个部分:
/ , /. , 这两个部分可以直接忽略
/.. , 弹栈
/xx, 压栈
最后全部输出即可
3. code
class Solution {
public:
string simplifyPath(string path) {
stack<string> mystack;
int pos = 0, last = 0;
string substr;
while ((pos = path.find('/', last)) < (int)path.size()){
// 提取字串
if (pos == -1)
substr = path.substr(last);
else
substr = path.substr(last, pos - last);
// 处理 /. /.. / /xx
if (substr == "" || substr == ".")
;
else if (substr == ".."){
if (!mystack.empty())
mystack.pop();
}
else{
mystack.push(substr);
}
if (pos == -1)
break;
last = pos + 1;
}
if (mystack.empty())
return "/";
string res;
while (!mystack.empty()){
res = "/" + mystack.top() + res;
mystack.pop();
}
return res;
}
};
4. 大神解法
一样的思路, 不过借助stringstream 实现字符串分隔, so brilliant !!!
string simplifyPath(string path) {
string res, tmp;
vector<string> stk;
stringstream ss(path);
while(getline(ss,tmp,'/')) {
if (tmp == "" or tmp == ".") continue;
if (tmp == ".." and !stk.empty()) stk.pop_back();
else if (tmp != "..") stk.push_back(tmp);
}
for(auto str : stk) res += "/"+str;
return res.empty() ? "/" : res;
}