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"
.
string simplifyPath(string path)
{
if (path == "")
return "";
vector<string> vec;
// 假设最大为100级
vec.resize(100);
vec[0] = "/";
// 假设都是从'/'开始的
int len = path.length();
if (len == 1 && path[0] == '/')
return "/";
int pos = 1;
int last = 0;
if (path[len - 1] != '/')
{
path += '/';
++len;
}
for (; pos < len; ++pos)
{
int index = path.find("/", pos);
string subStr = path.substr(pos, index - pos);
pos = index;
if (subStr == "")
continue;
if (subStr == ".")
{
}
else if (subStr == "..")
{
--last;
if (last < 0)
{
last = 0;
}
}
else
{
string str = vec[last];
if (last != 0)
{
str += '/';
}
str += subStr;
vec[++last] = str;
}
}
return vec[last];
}