您的位置:首页 > 其它

LeetCode | Simplify Path

2014-08-21 23:40 302 查看
Given an absolute path for a file (Unix-style), simplify it.

For example,

path =
"/home/"
, =>
"/home"


path =
"/a/./b/../../c/"
, =>
"/c"


click to show corner cases.

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"
.

题目解析:

根据情况,用栈来做。

例如:

输入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"

class Solution {
public:
string simplifyPath(string path) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
stack<string> s;
string str;
for(int i = 0; i < path.size(); i++)
{
if (path[i] == '/')
{
if (str == "..")
{
if (!s.empty())
s.pop();
}
else if (str != "." && str != "")
{
s.push(str);
}

str = "";   //重新清空
}
else
{
str += path[i]; //保存文件名,可能由多个字符组成
}
}

if (str == "..")    //处理最后的情况,
{
if (!s.empty())
s.pop();
}
else if (str != "." && str != "")
s.push(str);

if (s.empty())
return "/";

string ret;
while(!s.empty())
{
ret = "/" + s.top() + ret;
s.pop();
}

return ret;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: