71. 简化路径

自己做
解:遍历检查

cpp
class Solution {
public:
string simplifyPath(string path) {
int p = 0;
string res;
while(p < (int)path.size()){
//情况1:遇到"/./" =》p跳过"/."
if(p < (int)path.size() - 2 && path[p] == '/' && path[p + 1] == '.' && path[p + 2] == '/')
p += 2;
//情况2:遇到"//" =》p跳过"/"
else if(p < (int)path.size() - 1 && path[p] == '/' && path[p + 1] == '/')
p++;
//情况3_1:遇到"/abc" =》正常输入
else if(p < (int)path.size() - 1 && path[p] == '/' && path[p + 1] != '/' && path[p + 1] != '.'){
res.push_back(path[p]); //加入斜杠
p++;
while(p < (int)path.size() && path[p] != '/'){ //加入abc ,直到遍历结束或者遇到下个斜杠
res.push_back(path[p]);
p++;
}
}
//情况3_2:遇到"/..xxxxx" =》正常输入
else if(p < (int)path.size() - 3 && path[p] == '/' && path[p + 1] == '.' && path[p + 2] == '.' && path[p + 3] != '/'){
res.push_back(path[p]); //加入斜杠
p++;
while(p < (int)path.size() && path[p] != '/'){ //加入.......... ,直到遍历结束或者遇到下个斜杠
res.push_back(path[p]);
p++;
}
}
//情况3_3:遇到"/.xxxx" =》正常输入
else if(p < (int)path.size() - 2 && path[p] == '/' && path[p + 1] == '.' && path[p + 2] != '.' && path[p + 2] != '/'){
res.push_back(path[p]); //加入斜杠
p++;
while(p < (int)path.size() && path[p] != '/'){ //加入.......... ,直到遍历结束或者遇到下个斜杠
res.push_back(path[p]);
p++;
}
}
//情况4:遇到"/../"或者"/.."(末尾) =》弹出上级目录,p跳过"/.."【在检查完有没有/...的情况后】
else if(p < (int)path.size() - 2 && path[p] == '/' && path[p + 1] == '.' && path[p + 2] == '.'){
p += 3;
while(res.size() > 0 && res[(int)res.size() - 1] != '/') //对于res = "xxx/abc",弹出abc这个上级目录,得到结果res = "xxx/"
res.pop_back();
if(res.size() >= 1) //弹出斜杠
res.pop_back();
}
//情况5:末尾不成目录"abc/" =》 结束遍历
else
break;
}
//防止空目录
if(res.size() == 0)
res.push_back('/');
return res;
}
};

今日总结
