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"
.
Summary: Very careful about corner cases, like "/", "/.", "..".
1 class Solution { 2 public: 3 void handleEntry(vector<string> &path_stack, string path_entry) { 4 if(path_entry == "..") { 5 if(path_stack.size() > 0) 6 path_stack.pop_back(); 7 }else if (path_entry != ".") 8 path_stack.push_back(path_entry); 9 } 10 11 string simplifyPath(string path) { 12 string simple_path; 13 if(path.size() == 0) 14 return simple_path; 15 vector<string> path_stack; 16 string path_entry; 17 for(int i = 0; i < path.size(); i ++) { 18 if(path_entry.size() == 0 && path[i] == '/'){ 19 continue; 20 }else if (path_entry.size() != 0 && path[i] == '/') { 21 handleEntry(path_stack, path_entry); 22 path_entry.clear(); 23 }else { 24 path_entry.push_back(path[i]); 25 } 26 } 27 if(path_entry.size() > 0) 28 handleEntry(path_stack, path_entry); 29 30 for(string item: path_stack) { 31 simple_path += "/"; 32 simple_path += item; 33 } 34 if(simple_path.size() == 0) 35 return "/"; 36 return simple_path; 37 } 38 };