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"
.
class Solution {
public:
string simplifyPath(string path) {
if(path.size() == 0 || path[0] != '/')
return path;
stack<string> m_stack;
string result = "", sub = "";
m_stack.push("/");
int pre = 0, cur = 0;
while(path[pre] == '/')
pre++;
do
{
cur = path.find('/', pre);
if(cur == string::npos)
{
sub = path.substr(pre);
}
else
sub = path.substr(pre, cur-pre);
if(sub == "." || sub.empty())
{
}
else if(sub == "..")
{
if(m_stack.size() != 1)
m_stack.pop();
}
else
{
m_stack.push(sub);
}
pre = cur;
while(path[pre] == '/')
{
pre++;
}
}while(cur != string::npos);
while(!m_stack.empty())
{
result.insert(0, m_stack.top());
if(m_stack.size() > 2)
result.insert(0, "/");
m_stack.pop();
}
return result;
}
};