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实现的,当然也可以用栈
class Solution {
public:
string simplifyPath(string path) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
deque<string> queueS;
int pos = path.find("/");
if(pos == string::npos) return path;
queueS.push_back(path.substr(pos,1));
int old_pos = pos+1;
while((pos = path.find("/",old_pos))!=string::npos){
string temp = path.substr(old_pos,pos-old_pos);
if(temp == "..") {
if(queueS.size()>=2)
{
queueS.pop_back();
queueS.pop_back();
}
}else if(temp == ".") {}
else{
if(temp != "")
queueS.push_back(temp);
}
if(queueS.back() != "/") {
string s = path.substr(pos,1);
queueS.push_back(s);
}
old_pos = pos+1;
}
string temp = path.substr(old_pos);
if(temp == "..") {
if(queueS.size()>=2)
{
queueS.pop_back();
queueS.pop_back();
}
}else if(temp == ".") {}
else{
if(temp != "")
queueS.push_back(temp);
}
if(queueS.size()>1 && queueS.back()=="/") queueS.pop_back();
string ret;
while(!queueS.empty())
{
ret.append(queueS.front());
queueS.pop_front();
}
return ret;
}
};
36 milli secs.