题目:
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"
.
解题:
用栈可以搞,一个点不用管,两个点pop,最后再逆序输出
代码:
class Solution { public: string simplifyPath(string path) { stack<string> s; int pos = 0 while(1) { string tmp = check(path, pos); if(tmp == "") break; if(tmp == ".") continue; if(tmp == "..") { if(!s.empty()) s.pop(); } else s.push(tmp); } if(s.empty()) return "/"; Print(s); return ans; } private: string ans; string check(string path, int &pos) { while(path[pos] == '/') pos ++; string rec; int i; for(i = pos; i < path.size() && path[i] != '/'; i ++) rec += path[i]; pos = i; return rec; } void Print(stack<string> s) { if(s.empty()) return ; string top = s.top(); s.pop(); Print(s); ans += '/'; ans += top; } };