在 *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; } };