Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
Corner Cases:
- Did you consider the case where path =
"/../"
?
In this case, you should return"/"
. - Another corner case is the path might contain multiple slashes
'/'
together, such as"/home//foo/"
.
In this case, you should ignore redundant slashes and return"/home/foo"
.
如果仅仅从不断replace输入路径的角度出发,会非常复杂。
如果用一个栈来一次存储各级路径的directory名字,然后重组,会简便一些,这也是文件路径简化类题目的常用思路。
为了末尾可以顺序遍历栈重组path,我们不用传统的stack lib,而用vector来实现栈,这样可以方便顺序遍历。
代码:
class Solution { public: string simplifyPath(string path) { if(path.length() == 0) return ""; vector<string> v; int p = 0, start = 0; while(p < path.length()){ if(path[p] == '/') ++p; else{ start = p; while(p < path.length() && path[p] != '/') ++p; string temp = path.substr(start, p-start); if(temp == ".."){ if(!v.empty()) v.pop_back(); //遇到".."就出栈 else{ if(path[0] != '/') v.push_back(temp); //如果没东西可以出,就要看path是否以根目录开头了,不是以根目录开头的话,".."要进栈的 } }else if(temp == "."){} //遇到"."就跳过 else if(temp.length() > 0){ v.push_back(temp); } } } string res = (path[0] == '/' ? "/" : ""); //重组path for(vector<string>::iterator i = v.begin(); i < v.end(); ++i){ res.append(*i); if(i < v.end()-1) res.append("/"); } return res; } };