Simplify Path
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"
.
用一个堆栈来模拟路径的行为,遇到"."不操作,遇到".."退栈,其他情况都压入堆栈。
程序中先把路径分割出来,然后再处理
1 class Solution { 2 3 public: 5 string simplifyPath(string path) { 9 vector<string> spl; 11 spliceStr(path,spl); 15 vector<string> stk; 17 for(int i=0;i<spl.size();i++) 19 { 21 if(spl[i]=="..") 23 { 25 if(!stk.empty()) 27 { 29 stk.pop_back(); 31 } 33 } 35 else if(spl[i]==".") 37 { 39 continue; 41 } 43 else 45 { 47 stk.push_back(spl[i]); 49 } 51 } 55 string result=""; 57 for(int i=0;i<stk.size();i++) 59 { 61 result+="/"+stk[i]; 63 } 67 if(result=="") 69 { 71 result="/"; 73 } 79 return result; 83 } 84 85 86 87 88 89 void spliceStr(string &path,vector<string> &result) 91 { 93 int pre_index=0; 95 string tmp; 97 for(int i=0;i<path.size();i++) 99 { 101 if(path[i]=='/') 103 { 105 tmp=path.substr(pre_index,i-pre_index); 107 if(tmp!="") 109 { 111 result.push_back(tmp); 113 } 115 pre_index=i+1; 117 } 119 } 122 123 if(pre_index<path.size()) 125 { 127 tmp=path.substr(pre_index,path.size()-pre_index); 129 if(tmp!="") 131 { 133 result.push_back(tmp); 135 } 137 } 139 } 141 };