以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。
示例 1:
输入:"/home/" 输出:"/home" 解释:注意,最后一个目录名后面没有斜杠。
示例 2:
输入:"/../" 输出:"/" 解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。
示例 3:
输入:"/home//foo/" 输出:"/home/foo" 解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
示例 4:
输入:"/a/./b/../../c/" 输出:"/c"
示例 5:
输入:"/a/../../b/../c//.//" 输出:"/c"
示例 6:
输入:"/a//b////c/d//././/.." 输出:"/a/b/c"
解答:逻辑如下:
【1】所有相连的斜杠均可以取消,不保留,用start来记录状态;
【2】循环找相连的 '.',最后的位置为path[i-1],截取该字符串。
【3】判断是否为".."
判断p是否为空,是则contunue,否则弹出;
若不是'.'且s不为空,则p压入s;
若p为空,则直接返回'/';
否则依次添加路径
//71 string simplifyPath(string path) { vector<string> p; string res; int i=0,start; while(i<path.size()) { while(i<path.size() && path[i]=='/') i++;//斜杠全部可以取消,不保留 start = i; while(i<path.size() && path[i]!='/') i++; string s = path.substr(start,i-start); start = i; if(s == ".." ) { if(!p.empty()) p.pop_back(); continue; } else if(s!="." && s!="") p.push_back(s); } if(p.empty()) return "/"; for(string s: p) res = res+ "/" +s; return res; }//71