题目描述
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"
解题思路
队列。
从index = 1开始遍历string,当遇到’/’时,计算上一个’/’到现在之间中间的内容,存在如下三种情况。
- “.”或者”“,指的是当前路径,不做处理
- “..”,指的是返回上一层目录,将队列中最后一个元素移除。
- 其他,指的是文件夹名称,将其加入队列最后一个元素。
可以在最开始时候,给路径名末端加上”/”,用以确保路径完整,最后一个元素一定会被合理处理,这样就不用对最后的元素做额外的考虑了。
AC代码
class Solution {
public:
string simplifyPath(string path) {
if (path.empty())
return "";
list<string> s;
int startIdx = 1;
path += "/";
for (int i = 1; i < path.size(); ++i) {
if (path[i] == '/') {
string curPath = path.substr(startIdx, i - startIdx);
startIdx = i + 1;
if (curPath == "." || curPath == "")
continue;
else if (curPath == "..") {
if (!s.empty())
s.pop_back();
}
else {
s.push_back(curPath);
}
}
}
string ans;
while (!s.empty()) {
ans += ("/" + s.front());
s.pop_front();
}
if (ans == "")
return "/";
return ans;
}
};