@@ -114,6 +114,75 @@ Note that the returned array can be in a different order as the order does not m
114
114
#### Java
115
115
116
116
``` java
117
+ class Solution {
118
+ static class TrieNode {
119
+ Map<String , TrieNode > children = new HashMap<> ();
120
+ String name;
121
+ boolean isDeleted = false ;
122
+
123
+ TrieNode (String name ) {
124
+ this . name = name;
125
+ }
126
+ }
127
+
128
+ Map<String , List<TrieNode > > serialMap = new HashMap<> ();
129
+
130
+ public List<List<String > > deleteDuplicateFolder (List<List<String > > paths ) {
131
+ TrieNode root = new TrieNode (" " );
132
+
133
+ // Step 1: Build the folder trie
134
+ for (List<String > path : paths) {
135
+ TrieNode curr = root;
136
+ for (String folder : path) {
137
+ curr. children. putIfAbsent(folder, new TrieNode (folder));
138
+ curr = curr. children. get(folder);
139
+ }
140
+ }
141
+
142
+ // Step 2: Serialize and collect duplicates
143
+ serialize(root);
144
+
145
+ // Step 3: Mark duplicate folders
146
+ for (List<TrieNode > group : serialMap. values()) {
147
+ if (group. size() > 1 ) {
148
+ for (TrieNode node : group) {
149
+ node. isDeleted = true ;
150
+ }
151
+ }
152
+ }
153
+
154
+ // Step 4: Collect remaining paths
155
+ List<List<String > > result = new ArrayList<> ();
156
+ dfs(root, new ArrayList<> (), result);
157
+ return result;
158
+ }
159
+
160
+ private String serialize (TrieNode node ) {
161
+ if (node. children. isEmpty()) return " " ;
162
+
163
+ List<String > parts = new ArrayList<> ();
164
+ for (String childName : node. children. keySet(). stream(). sorted(). toList()) {
165
+ TrieNode child = node. children. get(childName);
166
+ String sub = serialize(child);
167
+ parts. add(childName + " [" + sub + " ]" );
168
+ }
169
+
170
+ String serial = String . join(" " , parts);
171
+ serialMap. computeIfAbsent(serial, k - > new ArrayList<> ()). add(node);
172
+ return serial;
173
+ }
174
+
175
+ private void dfs (TrieNode node , List<String > path , List<List<String > > result ) {
176
+ for (TrieNode child : node. children. values()) {
177
+ if (! child. isDeleted) {
178
+ path. add(child. name);
179
+ result. add(new ArrayList<> (path));
180
+ dfs(child, path, result);
181
+ path. remove(path. size() - 1 );
182
+ }
183
+ }
184
+ }
185
+ }
117
186
118
187
```
119
188
0 commit comments