给定一个文档(Unix-style)的完全路径,请进行路径简化。
样例
挑战
"/home/"
, => "/home"
"/a/./b/../../c/"
, => "/c"
-
你是否考虑了 路径 =
"/../"
的情况?在这种情况下,你需返回
"/"
。 -
此外,路径中也可能包含双斜杠
'/'
,如"/home//foo/"
。在这种情况下,可忽略多余的斜杠,返回
"/home/foo"
解题思路:
1.用split函数切割以“/”分隔的字符串
2.用一个栈存放路径,遇到..表示返回上一层路径则出栈,遇到.表示当前路径不变则什么都不用做,遇到文件名则进栈
3.把栈中路径取出来重新拼接
class Solution {
public:
vector<string> split(const string &s,const string &t){
int pos=0;
int size=t.length();
vector<int> index;
vector<string> ret;
while((pos=s.find(t,pos))!=string::npos){
index.push_back(pos);
pos+=size;
}
index.push_back(s.length());
size=index.size();
for(int i=0;i<size-1;++i)
if(index[i]+1!=index[i+1])
ret.push_back(s.substr(index[i]+1,index[i+1]-index[i]-1));
return ret;
}
string simplifyPath(string& S) {
if(S.empty())
return string();
vector<string> ret=split(S,"/");
stack<string> s;
int size=ret.size();
for(int i=0;i<size;++i){
if(!ret[i].compare("."))
continue;
else if(!ret[i].compare("..")){
if(!s.empty())
s.pop();
}else
s.push(ret[i]);
}
string result;
while(!s.empty()){
string sy="/"+s.top();
result=sy+result;
s.pop();
}
return result.length()==0?"/":result;
}
};