版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Neo233/article/details/85220553
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
path = "/a/../../b/../c//.//"
, => "/c"
path = "/a//b////c/d//././/.."
, => "/a/b/c"
In a UNIX-style file system, a period ('.') refers to the current directory, so it can be ignored in a simplified path. Additionally, a double period ("..") moves up a directory, so it cancels out whatever the last directory was. For more information, look here: https://en.wikipedia.org/wiki/Path_(computing)#Unix_style
Corner Cases:
- Did you consider the case where path =
"/../"
?
In this case, you should return"/"
. - Another corner case is the path might contain multiple slashes
'/'
together, such as"/home//foo/"
.
In this case, you should ignore redundant slashes and return"/home/foo"
.
这个题的意思是仿照Unix的路径规划来进行模拟
class Solution {
public:
string simplifyPath(string path) {
path += '/';//首先加上'/'以简化操作
string res,s;
for(auto c : path){
if(res.empty()){//res为实际的串
res += c;
}else if(c != '/'){//读入正常的串(两个'/'之间的串)
s += c;
}else{
if(s == ".."){
if(res.size() > 1){
res.pop_back();
}
while(res.back() != '/'){//连续退,主要是在两个'/'为一段很长的串的时候
res.pop_back();
}
}else if(s != "" && s != "."){//正常添加
res += s + '/';
}
s = "";//将这个串清零
}
}
if(res.size() > 1){
res.pop_back();//去掉'/'
}
return res;
}
};