对于空字符串和一个点,无需对它们进行处理,因为空字符串没有任何含义,而一个点表示当前目录本身,无需切换目录。对于两个点或者目录名,可以用一个栈来维护路径中的每一个目录名。当遇到两个点时,需要将目录切换到上一级,只要栈不为空,就弹出栈顶的目录。当遇到目录名时,就把它放入栈。
class Solution {
public:
string simplifyPath(string path) {
auto split = [](const string& s, char delim) -> vector<string> {
vector<string> ans;
string cur;
for (char ch: s) {
if (ch == delim) {
ans.push_back(move(cur));
cur.clear();
}
else {
cur += ch;
}
}
ans.push_back(move(cur));
return ans;
};
vector<string> names = split(path, '/');
vector<string> stack;
for (string& name: names) {
if (name == "..") {
if (!stack.empty()) {
stack.pop_back();
}
}
else if (!name.empty() && name != ".") {
stack.push_back(move(name));
}
}
string ans;
if (stack.empty()) {
ans = "/";
}
else {
for (string& name: stack) {
ans += "/" + move(name);
}
}
return ans;
}
};