LeetCode:简化路径【71】
题解参考天码营:https://www.tianmaying.com/tutorial/LC71
题目描述
给定一个文档 (Unix-style) 的完全路径,请进行路径简化。
例如,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
边界情况:
- 你是否考虑了 路径 =
"/../"
的情况?
在这种情况下,你需返回"/"
。 - 此外,路径中也可能包含多个斜杠
'/'
,如"/home//foo/"
。
在这种情况下,你可忽略多余的斜杠,返回"/home/foo"
。
题目分析
对于这道题目来说,最为关键的算法就是如何处理".."对于之前路径的“退回”操作。不难发现,每次“退回”的都是当前路径中的最后一个“文件夹”,每次进入的文件夹也都会出现在路径的最后。这样的一个“从一段添加或者删除”的模式恰恰就是栈的定义。
当我们知道要使用栈结构以后,还有几个坑需要注意:
- ""和"."都是不需要处理的
- /,//,///,只要是连续的斜线都是/
- 在根目录是使用".."是无法退后的,这TMD巨坑,结合实际了!
我们处理的步骤是如下:
- 如果当前段是
..
,则看stack中是否有元素,如果有,删除最后一个 - 如果当前段是
.
或者,则不做任何处理
- 否则将当前段加入到stack的末尾
这样,在处理完所有段之后,我们就可以确保仍然在stack中的就是最简单的路径字符串了,这个时候,我们只需要使用/
将他们拼接成答案即可。
Java题解
class Solution {
public String simplifyPath(String path) {
Stack<String> stringStack = new Stack<>();
String[] arr = path.split("/");
for(String str:arr)
{
if(str.equals("")||str.equals("."))
continue;
if(str.equals("..")) {
if(!stringStack.empty())
stringStack.pop();
}
else
stringStack.push(str);
} String ans = "";
while (!stringStack.empty())
{
ans="/"+stringStack.pop()+ans;
}
if(ans.equals(""))
return "/";
return ans;
}
}