Skip to content

Commit 385da57

Browse files
Create Solution.java
1948. Delete Duplicate Folders in System java solution
1 parent 1b53d4d commit 385da57

File tree

1 file changed

+69
-0
lines changed
  • solution/1900-1999/1948.Delete Duplicate Folders in System

1 file changed

+69
-0
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
class Solution {
2+
static class TrieNode {
3+
Map<String, TrieNode> children = new HashMap<>();
4+
String name;
5+
boolean isDeleted = false;
6+
7+
TrieNode(String name) {
8+
this.name = name;
9+
}
10+
}
11+
12+
Map<String, List<TrieNode>> serialMap = new HashMap<>();
13+
14+
public List<List<String>> deleteDuplicateFolder(List<List<String>> paths) {
15+
TrieNode root = new TrieNode("");
16+
17+
// Step 1: Build the folder trie
18+
for (List<String> path : paths) {
19+
TrieNode curr = root;
20+
for (String folder : path) {
21+
curr.children.putIfAbsent(folder, new TrieNode(folder));
22+
curr = curr.children.get(folder);
23+
}
24+
}
25+
26+
// Step 2: Serialize and collect duplicates
27+
serialize(root);
28+
29+
// Step 3: Mark duplicate folders
30+
for (List<TrieNode> group : serialMap.values()) {
31+
if (group.size() > 1) {
32+
for (TrieNode node : group) {
33+
node.isDeleted = true;
34+
}
35+
}
36+
}
37+
38+
// Step 4: Collect remaining paths
39+
List<List<String>> result = new ArrayList<>();
40+
dfs(root, new ArrayList<>(), result);
41+
return result;
42+
}
43+
44+
private String serialize(TrieNode node) {
45+
if (node.children.isEmpty()) return "";
46+
47+
List<String> parts = new ArrayList<>();
48+
for (String childName : node.children.keySet().stream().sorted().toList()) {
49+
TrieNode child = node.children.get(childName);
50+
String sub = serialize(child);
51+
parts.add(childName + "[" + sub + "]");
52+
}
53+
54+
String serial = String.join("", parts);
55+
serialMap.computeIfAbsent(serial, k -> new ArrayList<>()).add(node);
56+
return serial;
57+
}
58+
59+
private void dfs(TrieNode node, List<String> path, List<List<String>> result) {
60+
for (TrieNode child : node.children.values()) {
61+
if (!child.isDeleted) {
62+
path.add(child.name);
63+
result.add(new ArrayList<>(path));
64+
dfs(child, path, result);
65+
path.remove(path.size() - 1);
66+
}
67+
}
68+
}
69+
}

0 commit comments

Comments
 (0)