leetcode第一刷_Simplify Path
阿新 • • 發佈:2019-04-13
層次 eas link pid res 遇到 sheet 當前 empty
這道題的思路還是比較清晰的,用棧嘛,麻煩是麻煩在這些層次的細節上。主要有以下幾個:
./和/:當前路徑,遇到這樣的,應該將後面的文件夾或文件入棧。
../:上一層路徑。遇到這樣的。應該做一次出棧操作,相當於返回了上一層文件夾。
//:能夠直接簡化成‘/’。
還有以下幾個要註意的測試用例:
1. linux的路徑名能夠含有非常多特殊字符,比方“_”,".","*"等等,所以要特別註意含有"."的哪些路徑名。
2. 在路徑最後的..和.是不須要後面接上‘/‘的。
代碼寫的不是非常好。回頭應該更正一下:
class Solution { public: string simplifyPath(string path) { stack<string> s; int len = path.length(); int i=0; string tp, res=""; while(i<len){ if(path[i] == ‘/‘){i++;} else if(isalnum(path[i])||path[i]==‘_‘){ int j=i+1; while(path[i-1]==‘.‘) i--; while((isalnum(path[j])||path[j]==‘_‘)&&j<len) j++; tp = path.substr(i, j-i); s.push(tp); i = j; }else if(path[i] == ‘.‘){ if(i+1==len) break; else if(path[i+1]==‘/‘) i = i+2; else if(path[i+1]==‘.‘){ if(path[i+2] == ‘/‘||i+2==len){ i = i+3; if(!s.empty()) s.pop(); }else if(path[i+2] == ‘.‘){ if(i+3==len||path[i+3] == ‘/‘) s.push("..."); i = i+3; }else i = i+2; }else i = i+1; } } if(s.empty()) res = "/"; else{ while(!s.empty()){ res = "/"+s.top()+res; s.pop(); } } return res; } };
leetcode第一刷_Simplify Path