Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"
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".
思路:用双向队列deque来实现栈和按位访问的功能。遇到”.”就跳过,遇到”..”,若栈顶不为空,就弹出一个元素。遇到”//”这样的多重斜杠就跳过。最后按照格式输出即可。
//6 ms AC
class Solution {
public:
string simplifyPath(string path)
{
string res = "", tmp = "";
deque<string> d;
int len = path.length(), it = 0;
while(it < len)
{
if(path[it] == '/')
{
it++;
tmp.clear();
while(path[it]!='/' && it<len)
tmp += path[it++];
if(tmp == ".")
continue;
else if(tmp == "..") //返回上一级
{
if(d.empty())
continue;
else
d.pop_back();
}
else if(tmp != "")
d.push_back(tmp);
}
}
res += '/';
deque<string>::iterator i = d.begin();
while(i != d.end())
{
res += *i;
res += '/';
i++;
}
if(res.length() != 1)
res = res.substr(0,res.length()-1);
return res;
}
};