标签:
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
简化一个Unix风格的绝对路径。
从上面的例子可以看出需要支持‘.‘和‘..‘,另外还要考虑一些特殊情况如"/../"这样的要返回"/",如果多个‘/‘连在一起如"/home//foo/",返回"/home/foo"。
首先需要以‘/‘,对路径分隔出不同的token,然后使用一个stack来模拟路径,对每一个新token压入堆栈,如果是token是空或者‘.‘则不作处理,如果token是‘..‘并且堆栈不为空则弹出栈首,算法复杂度是O(N),N为输入路径的长度。给出代码如下,为了方便转换输出,下面用vector代替stack。
string simplifyPath(string path) { vector<string> prev; string str; int i = 0; while (!(str=next(path,i)).empty()) { if ("." == str) continue; if (".." == str) { if (!prev.empty()) prev.pop_back(); } else prev.push_back(str); } string ret; for (int i=0; i<prev.size(); ++i) ret += "/" + prev[i]; return ret.empty()?"/":ret; } string next(string path, int& i) { if (i == path.size()) return ""; size_t pos = path.find(‘/‘, i+1); if (pos != string::npos) { if (i+1 == pos) return next(path, ++i); string ret = path.substr(i+1, pos-i-1); i = pos; return ret; } else { string ret = path.substr(i+1); i = path.size(); return ret; } }
标签:
原文地址:http://www.cnblogs.com/zhiguoxu/p/5497059.html