@@ -135,6 +135,75 @@ tags:
135
135
#### Java
136
136
137
137
``` java
138
+ class Solution {
139
+ static class TrieNode {
140
+ Map<String , TrieNode > children = new HashMap<> ();
141
+ String name;
142
+ boolean isDeleted = false ;
143
+
144
+ TrieNode (String name ) {
145
+ this . name = name;
146
+ }
147
+ }
148
+
149
+ Map<String , List<TrieNode > > serialMap = new HashMap<> ();
150
+
151
+ public List<List<String > > deleteDuplicateFolder (List<List<String > > paths ) {
152
+ TrieNode root = new TrieNode (" " );
153
+
154
+ // Step 1: Build the folder trie
155
+ for (List<String > path : paths) {
156
+ TrieNode curr = root;
157
+ for (String folder : path) {
158
+ curr. children. putIfAbsent(folder, new TrieNode (folder));
159
+ curr = curr. children. get(folder);
160
+ }
161
+ }
162
+
163
+ // Step 2: Serialize and collect duplicates
164
+ serialize(root);
165
+
166
+ // Step 3: Mark duplicate folders
167
+ for (List<TrieNode > group : serialMap. values()) {
168
+ if (group. size() > 1 ) {
169
+ for (TrieNode node : group) {
170
+ node. isDeleted = true ;
171
+ }
172
+ }
173
+ }
174
+
175
+ // Step 4: Collect remaining paths
176
+ List<List<String > > result = new ArrayList<> ();
177
+ dfs(root, new ArrayList<> (), result);
178
+ return result;
179
+ }
180
+
181
+ private String serialize (TrieNode node ) {
182
+ if (node. children. isEmpty()) return " " ;
183
+
184
+ List<String > parts = new ArrayList<> ();
185
+ for (String childName : node. children. keySet(). stream(). sorted(). toList()) {
186
+ TrieNode child = node. children. get(childName);
187
+ String sub = serialize(child);
188
+ parts. add(childName + " [" + sub + " ]" );
189
+ }
190
+
191
+ String serial = String . join(" " , parts);
192
+ serialMap. computeIfAbsent(serial, k - > new ArrayList<> ()). add(node);
193
+ return serial;
194
+ }
195
+
196
+ private void dfs (TrieNode node , List<String > path , List<List<String > > result ) {
197
+ for (TrieNode child : node. children. values()) {
198
+ if (! child. isDeleted) {
199
+ path. add(child. name);
200
+ result. add(new ArrayList<> (path));
201
+ dfs(child, path, result);
202
+ path. remove(path. size() - 1 );
203
+ }
204
+ }
205
+ }
206
+ }
138
207
139
208
```
140
209
0 commit comments