本题的难度为中等但是却比较难实现,我一开始的思想是遇到“..”和‘.’直接跳过即可,实际上没有考虑到很多的问题,我想接下来一起解读这段代码为好
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中的字符串压入了ans中
cur.clear();
}
else {
cur += ch;
}
}
ans.push_back(move(cur));
return ans;
};
vector<string> names = split(path, '/');//split函数就是用于分割的
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;
}
};
整个代码的逻辑分为以下三个部分:
1.定义了split函数,根据/分割字符串
2.特别判定'.'和'..'如果说为前者不加入栈,为后者的话需要出栈
3.最后整合