对于路径
p
a
t
h
path
path ,遇到
′
/
′
'/'
′/′ 则操作,遇到其他字符则保存名字。操作有如下几种:
1.名字是
"
.
"
"."
"." 或
"
"
""
"" 不操作,前者表示在当前目录,后者表示遇到重复
"
/
"
"/"
"/" 。
2.名字是
"
.
.
"
".."
".." ,删除
a
n
s
ans
ans 的上一个目录名,如果
a
n
s
ans
ans 删空了。停止删除。
3.其他名字,答案加入
"
/
n
a
m
e
"
"/name"
"/name" ,
n
a
m
e
name
name 加入答案后,记得清空
n
a
m
e
name
name 。
最后,特判 a n s ans ans 为空,说明在根目录,返回 / / / ,其他情况返回 a n s ans ans 即可。
class Solution {
public:
string simplifyPath(string path) {
string ans, name;
if(path.back()!='/') path += '/';
for(auto& c:path){
if('/'!=c) name+=c;
else{
if(".."==name) {
while(ans.size()&&ans.back()!='/') ans.pop_back();
if(ans.size()) ans.pop_back();
}else if("."!=name&&""!=name) {
ans += '/'+name;
}
name.clear();
}
}
if(ans.empty()) ans += '/';
return ans;
}
};
时间复杂度 O ( n ) O(n) O(n) , p a t h path path 的长度 n n n ,每个字符最多进栈出栈一次,时间复杂度 O ( n ) O(n) O(n) 。
空间复杂度 O ( n ) O(n) O(n) ,最坏空间复杂度 O ( n ) O(n) O(n) 。
理解思路很重要。
欢迎读者在评论区留言,答主看到就会回复的。