链接:https://oj.leetcode.com/submissions/detail/9774025/
描述:
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
- 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"
.
解法:
本体对细节及边界考虑研究较高。
下面是我看到的一个比较好的解法描述(直接引过来):
面对这种题目一定要保持清醒,先分析好题目之后再开始码代码。
题目的要求是输出Unix下的最简路径,Unix文件的根目录为"/","."表示当前目录,".."表示上级目录。
例如:
输入1:
/../a/b/c/./..
输出1:
/a/b
模拟整个过程:
1. "/" 根目录
2. ".." 跳转上级目录,上级目录为空,所以依旧处于 "/"
3. "a" 进入子目录a,目前处于 "/a"
4. "b" 进入子目录b,目前处于 "/a/b"
5. "c" 进入子目录c,目前处于 "/a/b/c"
6. "." 当前目录,不操作,仍处于 "/a/b/c"
7. ".." 返回上级目录,最终为 "/a/b"
我用一个堆栈来模拟路径的行为,遇到"."不操作,遇到".."退栈,其他情况都压入堆栈。
P.S.
有以"."开头的路径,例如:"/.fdfd"。
实现中用到一个小技巧在path后面加一个‘/',不用单独处理最后一个情况。
代码实现如下:
string simplifyPath(string path) {
if( path.size() == 0 ) return "/";
path += "/";
int len = path.size();
int start = 1;
stack<string> s;
while( start < len)
{
int end = start;
while( path[end] != '/')
end++;
if( start == end ){
start++;
continue;
}
string str = path.substr(start, end-start);
if( str[0] == '.' && str.length() == 2 && str[1] == '.'){
if( !s.empty())
s.pop();
}else if( !(str[0] == '.' && str.length() == 1 )){
s.push(str);
}
start = end + 1;
}
if( s.empty()) return "/";
string result;
while( !s.empty() )
{
result = "/"+s.top()+ result;
s.pop();
}
return result;
}