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”.
class Solution {
public:
vector<string> splitString(string path)
{
vector<string> svec;
int len = path.size();
int beg = 0;
int end = 0;
string tmp = "";
for(int i = 0; i < len; ++i)
{
if(path[i] == '/')
{
if(beg != end)
{
svec.push_back(tmp);
end++;
beg = end;
tmp = "";
}
}else
{
tmp += path[i];
if(i + 1 == len)
{
svec.push_back(tmp);
}
end++;
}
}
return svec;
}
string simplifyPath(string path)
{
stack<string> st;
vector<string> s = splitString(path);
int len = s.size();
string Path = "";
for(int i = 0; i < len; ++i)
{
if(s[i] == "..")
{
if(!st.empty())
{
st.pop();
}
}else if(s[i] == ".")
{
//do nothing
}else
{
st.push(s[i]);
}
}
if(st.empty())
Path += "/";
while(!st.empty())
{
Path = "/" + st.top() + Path;
st.pop();
}
return Path;
}
};