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) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int len = path.size();
if (len == 0) return "/";
vector<string> stk;
int left = '/' == path[0]? 0: -1;
int right;
while(left < len)
{
right = left;
while(++right < len && '/' != path[right]);
string part = path.substr(left+1, right-left-1);
left = right;
if("." == part || "" == part)
continue;
else if(".." == part)
{
if(stk.size() > 0)
stk.pop_back();
}
else
stk.push_back(part);
}
if (stk.size() > 0)
{
string result = "";
for (int i = 0; i < stk.size(); ++i)
{
result += '/' + stk[i];
}
return result;
}
else
return "/";
}
};