問題描述:
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;
}