题目描述:
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
在Unix-style系统中"."表示当前目录,".."表示上一级目录。
因此可以使用堆栈保存目录名,每遇到一个目录名就压入堆栈,每遇到".."就把堆栈顶部的目录名出栈,表示回到上一级目录,
而遇到"."什么也不用做。最后把堆栈中剩下的目录名连接起来即可。
AC代码如下:
class Solution {
public:
string simplifyPath(string path) {
vector<string> dirs;
int size = path.size();
if (size <= 0) return string();
if (path[size - 1] != '/'){
path.push_back('/');
size = path.size();
}
string ptn1 = ".";
string ptn2 = "..";
int pre = 1;
for (int cur = 1; cur < size;){
int found = path.find('/', cur);
//if (found == string::npos)
// break;
string dir=path.substr(pre, found - pre);
if (dir == ptn2){
if (dirs.size()>0)
dirs.pop_back();
}
else if (dir == ptn1 || dir==""){
}else{
dirs.push_back(dir);
}
pre = cur = found + 1;
}
int len = dirs.size();
string ans = "";
for (int i = 0; i < len; ++i){
ans = ans + "/" + dirs[i];
}
if (len == 0) ans = ans + "/";
return ans;
}
};