Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
给出一个unix的完全路径,然后简化这个路径。主要的就是 /.. 表示返回上级目录, /. 表示在当前目录。
思路:
因为要是返回上级目录,就是退出当前目录,很容易联想到栈的性质。所以用栈存储访问的目录的顺序。在扫描给的路径的过程中,注意一下 /.. 和 /. 两种情况即可。还有最后一位不一定是'/',所以也要判断一下。提示里面有要求注意 /../ 的这种情况,需要在pop前判断一个栈是否为空即可。
代码:
class Solution {
public:
string simplifyPath(string path){
stack<string> res;
int len=path.size();
string s="";
bool canAdd=true;
for(int i=0; i<len; i++){
if(path[i]=='.'){
if(i+1<len && path[i+1]=='/' && i>=1 && path[i-1]=='/'){
}
else if(i+2<len && path[i+2]=='/' && i>=1 && path[i-1]=='/'){
if(!res.empty()) res.pop();
i++;
}
else s+=path[i];
}
else if(path[i]!='/') s+=path[i];
else{
if(s!="") res.push(s);
s="";
}
}
if(path[len-1]!='/'){
if(len-2>=0 && path[len-1]=='.' && path[len-2]=='/'){
}
else if(len-3>=0 && path[len-1]=='.' && path[len-2]=='.' && path[len-3]=='/'){
if(!res.empty()) res.pop();
}
else res.push(s);
}
string ans;
string str;
if(res.empty()) return "/";
while(!res.empty()){
str=res.top();
res.pop();
reverse(str.begin(), str.end());
str+='/';
ans+=str;
}
reverse(ans.begin(), ans.end());
return ans;
}
};