kniost

谁怕,一蓑烟雨任平生

0%

LeetCode 71. Simplify Path

71. Simplify Path

Difficulty: Medium

Given an absolute path for a file (Unix-style), simplify it. Or in other words, convert it to the canonical path.

In a UNIX-style file system, a period . refers to the current directory. Furthermore, a double period .. moves the directory up a level. For more information, see:

Note that the returned canonical path must always begin with a slash /, and there must be only a single slash / between two directory names. The last directory name (if it exists) must not end with a trailing /. Also, the canonical path must be the shortest string representing the absolute path.

Example 1:

1
2
3
Input: "/home/"
Output: "/home"
Explanation: Note that there is no trailing slash after the last directory name.

Example 2:

1
2
3
Input: "/../"
Output: "/"
Explanation: Going one level up from the root directory is a no-op, as the root level is the highest level you can go.

Example 3:

1
2
3
Input: "/home//foo/"
Output: "/home/foo"
Explanation: In the canonical path, multiple consecutive slashes are replaced by a single one.

Example 4:

1
2
Input: "/a/./b/../../c/"
Output: "/c"

Example 5:

1
2
Input: "/a/../../b/../c//.//"
Output: "/c"

Example 6:

1
2
Input: "/a//b////c/d//././/.."
Output: "/a/b/c"

Solution

Language: Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Solution {
public String simplifyPath(String path) {
if (path == null || path.length() == 0) {
return "";
}
List<String> dirs = new ArrayList<>();
int cur = 0;
dirs.add("");
int start = 0;
while (cur < path.length()) {
char c = path.charAt(cur);
if (c == '/') {
while (cur + 1 < path.length() && path.charAt(cur + 1) == '/') {
cur++;
}
cur++;
} else if (c == '.' && ((cur + 1 >= path.length() || path.charAt(cur + 1) == '/') || (cur + 1 < path.length() && path.charAt(cur + 1) == '.' && (cur + 2 >= path.length() || path.charAt(cur + 2) == '/')))) {
if (cur + 1 < path.length() && path.charAt(cur + 1) == '.') {
cur++;
if (dirs.size() > 1) {
dirs.remove(dirs.size() - 1);
}
}
cur++;
} else {
start = cur;
cur++;
while (cur < path.length() && path.charAt(cur) != '/') {
cur++;
}
dirs.add(path.substring(start, cur));
}
}
if (dirs.size() == 1) {
return "/";
}
return String.join("/", dirs);
}
}