LeetCode:简化路径【71】
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;
}
}

浙公网安备 33010602011771号