@@ -114,6 +114,75 @@ Note that the returned array can be in a different order as the order does not m
114114#### Java
115115
116116``` 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+ }
117186
118187```
119188
0 commit comments