Given an absolute path for a file (Unix-style), simplify it.
For example,
path =
path =
path =
"/home/"
, => "/home"
path =
"/a/./b/../../c/"
, => "/c"
1. ‘/’ 是delimiter, 分界符,相当于是说明一个下面开始一个目录了。
2. '.' 指当前目录,再处理的时候可以直接忽略
3. ‘..’ 指parent 目录, 在处理的时候可以直接把当前目录删除,回到上一级目录
4. 其他字符或者字符串, 目录名,需要保留
这个题目的解法其实是模拟了一个stack,因为每次到当前字符的时候,需要对之前的那个目录级的元素进行处理,我们可以用两个变量来模拟这个过程, curDir只存当前的目录,即在 ‘/’ 和 ‘/’之间的string, allDir存当目前为止处理好的目录,allDir里面暂时不加'/',仅仅只是独立的目录,在最后得到 rst的时候再对这些独立的目录加 ‘/’分解符进行处理。
class Solution {
public:
string simplifyPath(string path) {
string curDir = "";
vector<string> allDir;
path += "/";
for (char c : path) {
if (c == '/') {
if (curDir.size() == 0) {
continue;
} else if (curDir == ".") {
curDir.clear();
} else if (curDir == "..") {
if (!allDir.empty()) {
allDir.pop_back();
}
curDir.clear();
} else {
allDir.push_back(curDir);
curDir.clear();
}
} else {
curDir += c;
}
}
string rst = "";
for (int i = 0; i < allDir.size(); i++) {
rst += "/" + allDir[i];
}
if (rst.size() == 0) rst += "/";
return rst;
}
};
public:
string simplifyPath(string path) {
string curDir = "";
vector<string> allDir;
path += "/";
for (char c : path) {
if (c == '/') {
if (curDir.size() == 0) {
continue;
} else if (curDir == ".") {
curDir.clear();
} else if (curDir == "..") {
if (!allDir.empty()) {
allDir.pop_back();
}
curDir.clear();
} else {
allDir.push_back(curDir);
curDir.clear();
}
} else {
curDir += c;
}
}
string rst = "";
for (int i = 0; i < allDir.size(); i++) {
rst += "/" + allDir[i];
}
if (rst.size() == 0) rst += "/";
return rst;
}
};
No comments:
Post a Comment