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"
.
注意以下几点:input"/.", output"/"
input"/..", output"/"
input"/...", output"/..."即“...”、“....”等是有效的文件名
class Solution { public: string simplifyPath(string path) { if(path == "/" || path=="") return path; string result(1,path[0]); int len = path.size(); if(path[len-1]!=‘/‘){ path.push_back(‘/‘); len++; } int j=0,start; stack<int> sstart; for(int i = 1;i<len;){ if(path[i] != ‘/‘ && path[i] != ‘.‘){//if(1) while(i<len && path[i]!=‘/‘){ result.push_back(path[i++]); j++; } int flag = j; while(flag>=0 && result[flag]!=‘/‘){ flag--; } sstart.push(flag+1); if(i<len-1 && path[i]==‘/‘){ result.push_back(path[i++]); j++; }else if(i == len-1 && path[i]==‘/‘){ return result; } }else{ if(path[i]==‘/‘ && result[j]==‘/‘) i++; else if(i<len-1 && path[i]==‘.‘ && path[i+1]==‘/‘){ i=i+2; }else if(i<len-2 && path[i]==‘.‘ && path[i+1]==‘.‘&& path[i+2]==‘/‘){ i = i+3; if(result.size() == 1) continue; else{ if(result[j]==‘/‘){ start = sstart.top(); sstart.pop(); result.erase(result.begin()+start,result.end()); j = start-1; }else{ // "/.../""output"/.../" int flag = j; while(flag>=0 && result[flag]!=‘/‘){ flag--; } sstart.push(flag+1); result.push_back(path[i-3]); result.push_back(path[i-2]); if(i-1<len-1 && path[i-1]==‘/‘){ result.push_back(path[i-1]); j+=3; }else if(i-1 == len-1 && path[i-1]==‘/‘){ return result; } } } }else{ result.push_back(path[i++]); j++; } }//end if(1) }//end for while(result[j]==‘/‘ && result.size()!=1){ result = result.substr(0,j); j--; } return result; }//end func };
[LeetCode] Simplify Path(可以不用看)
时间: 2024-10-20 10:17:43