Given an absolute path for a file (Unix-style), simplify it.
For example,
path =
path =
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"
.
Unix的path规则可以在这里了解:
http://en.wikipedia.org/wiki/Path_(computing)
归下类的话,有四种字符串:
1. "/":为目录分隔符,用来分隔两个目录。
2. ".":当前目录
3. "..":上层目录
4. 其他字符串:目录名
简化的核心是要找出所有的目录,并且如果遇到"..",需要删除上一个目录。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | class Solution { public: string simplifyPath(string path) { string ret, curDir; vector<string> allDir; path.push_back('/'); for(int i=0; i<path.size(); i++) { if(path[i]=='/') { if(curDir.empty()) { 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.push_back(path[i]); } } for(int i=0; i<allDir.size(); i++) ret.append("/"+allDir[i]); if(ret.empty()) ret = "/"; return ret; } }; |
No comments:
Post a Comment