-
Notifications
You must be signed in to change notification settings - Fork 20
Expand file tree
/
Copy pathSimplifyPath.java
More file actions
92 lines (86 loc) · 3.2 KB
/
Copy pathSimplifyPath.java
File metadata and controls
92 lines (86 loc) · 3.2 KB
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package by.andd3dfx.collections;
import java.util.ArrayDeque;
import java.util.Deque;
/**
* <pre>
* <a href="https://leetcode.com/problems/simplify-path/description/">Task description</a>
*
* You are given an absolute path for a Unix-style file system, which always begins with a slash '/'. Your task is to transform this absolute path into its simplified canonical path.
*
* The rules of a Unix-style file system are as follows:
*
* A single period '.' represents the current directory.
* A double period '..' represents the previous/parent directory.
* Multiple consecutive slashes such as '//' and '///' are treated as a single slash '/'.
* Any sequence of periods that does not match the rules above should be treated as a valid directory or file name. For example, '...' and '....' are valid directory or file names.
*
* The simplified canonical path should follow these rules:
*
* The path must start with a single slash '/'.
* Directories within the path must be separated by exactly one slash '/'.
* The path must not end with a slash '/', unless it is the root directory.
* The path must not have any single or double periods ('.' and '..') used to denote current or parent directories.
*
* Return the simplified canonical path.
*
* Example 1:
* Input: path = "/home/"
* Output: "/home"
* Explanation:
* The trailing slash should be removed.
*
* Example 2:
* Input: path = "/home//foo/"
* Output: "/home/foo"
* Explanation:
* Multiple consecutive slashes are replaced by a single one.
*
* Example 3:
* Input: path = "/home/user/Documents/../Pictures"
* Output: "/home/user/Pictures"
* Explanation:
* A double period ".." refers to the directory up a level (the parent directory).
*
* Example 4:
* Input: path = "/../"
* Output: "/"
* Explanation:
* Going one level up from the root directory is not possible.
*
* Example 5:
* Input: path = "/.../a/../b/c/../d/./"
* Output: "/.../b/d"
* Explanation:
* "..." is a valid name for a directory in this problem.
* </pre>
*
* @see <a href="https://youtu.be/ZONpIPMSNPk">Video solution</a>
*/
public class SimplifyPath {
public static String simplifyPath(String path) {
Deque<String> stack = new ArrayDeque<>();
path = path.replaceAll("/+", "/");
StringBuilder accumulator = new StringBuilder();
var chars = path.toCharArray();
var i = 1;
while (i < chars.length) {
if (chars[i] == '/') {
processAccumulated(accumulator, stack);
accumulator = new StringBuilder();
} else {
accumulator.append(chars[i]);
}
i++;
}
processAccumulated(accumulator, stack);
return "/" + String.join("/", stack.reversed());
}
private static void processAccumulated(StringBuilder accumulator, Deque<String> stack) {
var accumulated = accumulator.toString();
if (accumulated.equals("..") && !stack.isEmpty()) {
stack.pop();
} else if (!accumulated.matches("\\.{1,2}") && !accumulated.isEmpty()) {
stack.push(accumulated);
}
}
}