Description:
给定一个文档 (Unix-style) 的完全路径,请进行路径简化。
例如,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
边界情况:
- 你是否考虑了 路径 =
"/../"
的情况?
在这种情况下,你需返回"/"
。 - 此外,路径中也可能包含多个斜杠
'/'
,如"/home//foo/"
。
在这种情况下,你可忽略多余的斜杠,返回"/home/foo"
看起来和Unix系统文件的路径(相对和绝对)有关。我对这方面不太懂,改了半天发现自己只能实现'/'语法的功能。。。无奈去查了一下相关答案关于点号'.'的说明:当标识文件名时,也用符号“."和".."。他们分别标识当前工作目录和父目录。如果当前工作目录是根目录“."和".."就是一致的.
思路:这个方法巧妙的将传统上考虑到的仅声明一个string类型的返回值,变化为还包含一个存储字符串类型的数组,这样我们很容易就能对一一提取出来并做相关处理(厉害啊!!)。另外这里的 "." 就是直接直接去掉, ".."代表删掉它上面挨着的一个路径。另外要注意当v为空时返回"/"(但OJ上给出的此时的答案是"",但运行时却可以AC,可能是bug),代码如下:
//简化路径
//将路径看成一个由多个字符串(代表文件名)组成的序列,故利用数组来存储返回结果
class Solution {
public:
string simplifyPath(string path) {
vector<string>v;
int i = 0;
while (i < path.size()) {
//忽略掉'/'
while (path[i] == '/' && i < path.size())
++i;
if (i == path.size())
break;
//此时遇到的字符一定不为'/'
int start = i;
while (path[i] != '/' && i < path.size())
++i;
int end = i - 1;
//代表文件名(也可能为'.'或'..')
string s = path.substr(start, end - start + 1);
if (s == "..") {
if (!v.empty())
v.pop_back();
}
else if (s != ".")
v.push_back(s);
//注:以上仅讨论当s为文件夹名和".."的情况,即忽略了".",因为它的作用是直接删去,正好符合要求
}
if (v.empty())
return "/";
string res;
for (int i = 0; i < v.size(); ++i) {
res += '/' + v[i];
}
return res;
}
};
参考资料:http://www.cnblogs.com/grandyang/p/4347125.html