71 简化路径
一、题目
给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为 更加简洁的规范路径。
在 Unix 风格的文件系统中规则如下:
- 一个点
'.'表示当前目录本身。 - 此外,两个点
'..'表示将目录切换到上一级(指向父目录)。 - 任意多个连续的斜杠(即,
'//'或'///')都被视为单个斜杠'/'。 - 任何其他格式的点(例如,
'...'或'....')均被视为有效的文件/目录名称。
返回的 简化路径 必须遵循下述格式:
- 始终以斜杠
'/'开头。 - 两个目录名之间必须只有一个斜杠
'/'。 - 最后一个目录名(如果存在)不能 以
'/'结尾。 - 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含
'.'或'..')。
返回简化后得到的 规范路径 。

二、题解
思路: 栈 + 字符串分割
核心是把路径按 / 拆分,再用一个栈来模拟目录的进入与返回。
- 分割: 用
/切分原始路径,得到若干段。由于连续斜杠、开头斜杠的存在,分割结果里会夹杂空字符串""。 - 逐段处理:
- 遇到
..:表示返回上一级,若栈非空则弹出栈顶目录。 - 遇到
""(连续斜杠产生)或.(当前目录):直接忽略。 - 其余情况:视为合法目录名,压入栈中。
- 遇到
- 拼接结果: 栈中从底到顶就是规范路径上的各级目录,用
/连接并在最前面补一个根目录/即可。
import java.util.LinkedList;
class Solution {
public String simplifyPath(String path) {
// 使用 LinkedList 作为栈来存储目录路径
LinkedList<String> stack = new LinkedList<>();
// 按照 "/" 分割路径
String[] directories = path.split("/");
for (String dir : directories) {
// 遇到 "..",表示返回上一级,从栈顶弹出一个目录
if (dir.equals("..")) {
if (!stack.isEmpty()) {
stack.removeLast();
}
}
// 遇到普通目录名,压入栈中
// 排除掉空字符串 "" (连续斜杠导致) 和 "." (当前目录)
else if (!dir.isEmpty() && !dir.equals(".")) {
stack.addLast(dir);
}
}
// 将栈中元素用 "/" 拼接,前面再加上根目录的 "/"
return "/" + String.join("/", stack);
}
}
时间复杂度:
空间复杂度:
评论