在 *nix 操作系统中,系统对当前目录的管理就是通过栈来实现的,本问题就是对这一过程的模拟。思路是先将 path 串根据 “/” 分割,再对分割出来的子串根据 “.” “..” 等规则进行操作。由于 C++ 的 string 没有原生的 split 函数,这里采用 stringstream 对象和 getline() 巧妙实现了这一功能。
class Solution {
public:
string simplifyPath(string path) {
stringstream ss;
ss << path;
string splitItem;
vector<string> filenames;
while(getline(ss, splitItem, '/')) { // 使用字符流对象巧妙实现C++字符串的split操作
if(splitItem == "" || splitItem == ".") { // 空白和".不理会
continue;
} else if(splitItem == ".."){ // 返回上级目录
if(filenames.size() > 0)
filenames.pop_back();
} else { // 将普通目录压入栈(这里就用vector方便后面遍历取结果)
filenames.push_back(splitItem);
}
}
string res;
for(int i = 0; i < filenames.size(); i ++) {
res.append("/" + filenames[i]);
}
if(res == ""){
return "/";
}
return res;
}
};