LeetCode-71-简化路径

题目

给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

  • 始终以斜杠 '/' 开头。
  • 两个目录名之间必须只有一个斜杠 '/'
  • 最后一个目录名(如果存在)不能'/' 结尾。
  • 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.''..')。

返回简化后得到的 规范路径

示例 1:

1
2
3
输入:path = "/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。

示例 2:

1
2
3
输入:path = "/../"
输出:"/"
解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。

示例 3:

1
2
3
输入:path = "/home//foo/"
输出:"/home/foo"
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。

示例 4:

1
2
输入:path = "/a/./b/../../c/"
输出:"/c"

提示:

  • 1 <= path.length <= 3000
  • path 由英文字母,数字,'.''/''_' 组成。
  • path 是一个有效的 Unix 风格绝对路径。

题解

这一题倒是也不难,可是为什么做不出来...orz /(ㄒoㄒ)/~~

这里栈还是用的Deque

遍历path

  • 如果当前符号为'/',就继续找;
  • 如果不是,用j定位到下一个'/'位置,截取两个'/'之间的内容;
  • 如果该内容为".."那么栈弹出,当然要判断不为空;
  • 如果不是".",那么正常加入即可;
  • 如果是"."不用理会(表示当前文件夹);
  • 然后继续遍历。

最后我们拼接字符串即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public String simplifyPath(String path) {
Deque<String> d = new ArrayDeque<>();
int n = path.length();
for (int i = 1; i < n; ) {
if (path.charAt(i) == '/' && ++i >= 0) continue; // ++i > 0是为了递增i
int j = i + 1;
while (j < n && path.charAt(j) != '/') j++;
String item = path.substring(i, j);
if (item.equals("..")) {
if (!d.isEmpty()) d.pollLast();
} else if (!item.equals(".")) {
d.addLast(item);
}
i = j;
}
StringBuilder sb = new StringBuilder();
while (!d.isEmpty()) sb.append("/" + d.pollFirst());
return sb.length() == 0 ? "/" : sb.toString();
}
}

LeetCode-71-简化路径
https://excelius.xyz/leetcode-71-简化路径/
作者
Ther
发布于
2024年7月10日
许可协议