這道題的思路還是比較清晰的,用棧嘛,麻煩是麻煩在這些層次的細節上。主要有下面幾個:
./和/:當前路徑,遇到這種,應該將後面的檔案夾或檔案入棧。
../:上一層路徑,遇到這種,應該做一次出棧操作,相當於返回了上一層目錄。
//:可以直接簡化成‘/’。
還有下面幾個要注意的測試案例:
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; }};