標籤:
Simplify Path
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"
click to show corner cases.
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 };
【leetcode】Simplify Path