1、简化路径:
思路: 以段为单位来处理。
代码1
class Solution {
public:
string simplifyPath(string path) {
path += "/"; //方便处理不以 `/`结尾的path
string res, s; // res为返回结果,s 为当前段
for(auto c : path)
{
if(res.empty()) res += c; //第一次先把 '/'存进去
else if(c != '/') s += c;
else
{
if(s == "..") //要去掉上一层 比如当前 res = "/home/" , s = ".." ; ---> res = "/";
{
if(res.size() > 1) //是不是最顶层
{
res.pop_back(); //去掉结尾的 '/'
while(res.back() != '/') // 去掉上层文件夹名,比如这里的 "home"
res.pop_back();
}
}
else if(s != "" && s != ".") //如果是空或者'.' 就不加进去
res += s + '/' ;
s = ""; //清空 s
}
}
if(res.size() > 1) res.pop_back(); //把最后的 '/'去掉
return res;
}
};
代码2
class Solution {
public:
string simplifyPath(string path) {
string res, t; //t 为当前段
stringstream ss(path);
vector<string> v;
while (getline(ss, t, '/')) {
if (t == "" || t == ".") continue;
if (t == ".." && !v.empty()) v.pop_back(); //上一段去掉
else if (t != "..") v.push_back(t);
}
for (string s : v) res += "/" + s;
return res.empty() ? "/" : res;
}
};