主要思路
首先想到将字符串按 ‘/’ 分隔开,然后分情况讨论该子串类型,如果是当前目录,即一个点 " . “或者是空串”"我们跳过就可以了不需要做处理,如果是上一级目录,即两个点 " . . "我们需要返回上一级目录,如果此时栈非空,我们需要将栈顶元素出栈。最后如果是其他类型的目录我们直接入栈就好,它是最终合法的需要输出的路径。我们这里使用vector模拟栈。
因为c++语言没有split这样的函数,我们使用如下方法分隔处理字符串:string str; stringstream ss(path); while (getline(ss, str, '/')){}
class Solution {
public:
string simplifyPath(string path) {
string str = "";
stringstream ss(path);
vector<string> vecs;
while(getline(ss,str,'/')) {//以‘/’ 分隔,将字符串写入str中
if(str=="."||str=="")continue;//这里有str为空是因为分割链表后可能为空,如本来就是‘/’分割后为空
else if(str=="..") {
if(!vecs.empty())
vecs.pop_back();
}
else vecs.emplace_back(str);
}
string ret="";
for(size_t i = 0;i<vecs.size();++i) {
ret += "/"+vecs[i];
}
if(vecs.empty())ret = "/";
return ret;
}
};