问题描述:
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".
问题分析:
对于一个给定的路径做简化处理, 需要解决如下几个问题:
1. 正确的识别出目录
2. 目录分为三种:
. 目录 跳过
.. 目录 弹出栈顶元素
普通目录 入栈
示例代码:
string simplifyPath(string path)
{
vector<string> st;
string ret;
assert(path[0] == '/');
int n = path.length();
int i = 0;
while (i < n)
{
for (i = i + 1; i < n && path[i] == '/'; i++);
if (i >= n) break;
int start = i;
for (i = i + 1; i < n && path[i] != '/'; i++);
int end = i;
string dir = path.substr(start, end - start);
if (dir == "..")
{
if (!st.empty()) st.pop_back();
}
else if (dir != ".")
{
st.push_back(dir);
}
else
{ /* no operation */ }
}
if (st.empty()) return "/";
for (i = 0; i < st.size(); i++)
{
ret += "/" + st[i];
}
return ret;
}