diff --git a/solution/1900-1999/1948.Delete Duplicate Folders in System/README.md b/solution/1900-1999/1948.Delete Duplicate Folders in System/README.md index d3255436fb79c..795f6cc403120 100644 --- a/solution/1900-1999/1948.Delete Duplicate Folders in System/README.md +++ b/solution/1900-1999/1948.Delete Duplicate Folders in System/README.md @@ -135,6 +135,75 @@ tags: #### Java ```java +class Solution { + static class TrieNode { + Map children = new HashMap<>(); + String name; + boolean isDeleted = false; + + TrieNode(String name) { + this.name = name; + } + } + + Map> serialMap = new HashMap<>(); + + public List> deleteDuplicateFolder(List> paths) { + TrieNode root = new TrieNode(""); + + // Step 1: Build the folder trie + for (List path : paths) { + TrieNode curr = root; + for (String folder : path) { + curr.children.putIfAbsent(folder, new TrieNode(folder)); + curr = curr.children.get(folder); + } + } + + // Step 2: Serialize and collect duplicates + serialize(root); + + // Step 3: Mark duplicate folders + for (List group : serialMap.values()) { + if (group.size() > 1) { + for (TrieNode node : group) { + node.isDeleted = true; + } + } + } + + // Step 4: Collect remaining paths + List> result = new ArrayList<>(); + dfs(root, new ArrayList<>(), result); + return result; + } + + private String serialize(TrieNode node) { + if (node.children.isEmpty()) return ""; + + List parts = new ArrayList<>(); + for (String childName : node.children.keySet().stream().sorted().toList()) { + TrieNode child = node.children.get(childName); + String sub = serialize(child); + parts.add(childName + "[" + sub + "]"); + } + + String serial = String.join("", parts); + serialMap.computeIfAbsent(serial, k -> new ArrayList<>()).add(node); + return serial; + } + + private void dfs(TrieNode node, List path, List> result) { + for (TrieNode child : node.children.values()) { + if (!child.isDeleted) { + path.add(child.name); + result.add(new ArrayList<>(path)); + dfs(child, path, result); + path.remove(path.size() - 1); + } + } + } +} ``` diff --git a/solution/1900-1999/1948.Delete Duplicate Folders in System/README_EN.md b/solution/1900-1999/1948.Delete Duplicate Folders in System/README_EN.md index 01fa7d10a03c7..05465de2bf8a9 100644 --- a/solution/1900-1999/1948.Delete Duplicate Folders in System/README_EN.md +++ b/solution/1900-1999/1948.Delete Duplicate Folders in System/README_EN.md @@ -114,6 +114,75 @@ Note that the returned array can be in a different order as the order does not m #### Java ```java +class Solution { + static class TrieNode { + Map children = new HashMap<>(); + String name; + boolean isDeleted = false; + + TrieNode(String name) { + this.name = name; + } + } + + Map> serialMap = new HashMap<>(); + + public List> deleteDuplicateFolder(List> paths) { + TrieNode root = new TrieNode(""); + + // Step 1: Build the folder trie + for (List path : paths) { + TrieNode curr = root; + for (String folder : path) { + curr.children.putIfAbsent(folder, new TrieNode(folder)); + curr = curr.children.get(folder); + } + } + + // Step 2: Serialize and collect duplicates + serialize(root); + + // Step 3: Mark duplicate folders + for (List group : serialMap.values()) { + if (group.size() > 1) { + for (TrieNode node : group) { + node.isDeleted = true; + } + } + } + + // Step 4: Collect remaining paths + List> result = new ArrayList<>(); + dfs(root, new ArrayList<>(), result); + return result; + } + + private String serialize(TrieNode node) { + if (node.children.isEmpty()) return ""; + + List parts = new ArrayList<>(); + for (String childName : node.children.keySet().stream().sorted().toList()) { + TrieNode child = node.children.get(childName); + String sub = serialize(child); + parts.add(childName + "[" + sub + "]"); + } + + String serial = String.join("", parts); + serialMap.computeIfAbsent(serial, k -> new ArrayList<>()).add(node); + return serial; + } + + private void dfs(TrieNode node, List path, List> result) { + for (TrieNode child : node.children.values()) { + if (!child.isDeleted) { + path.add(child.name); + result.add(new ArrayList<>(path)); + dfs(child, path, result); + path.remove(path.size() - 1); + } + } + } +} ``` diff --git a/solution/1900-1999/1948.Delete Duplicate Folders in System/Solution.java b/solution/1900-1999/1948.Delete Duplicate Folders in System/Solution.java new file mode 100644 index 0000000000000..19dc9bb8b8c36 --- /dev/null +++ b/solution/1900-1999/1948.Delete Duplicate Folders in System/Solution.java @@ -0,0 +1,69 @@ +class Solution { + static class TrieNode { + Map children = new HashMap<>(); + String name; + boolean isDeleted = false; + + TrieNode(String name) { + this.name = name; + } + } + + Map> serialMap = new HashMap<>(); + + public List> deleteDuplicateFolder(List> paths) { + TrieNode root = new TrieNode(""); + + // Step 1: Build the folder trie + for (List path : paths) { + TrieNode curr = root; + for (String folder : path) { + curr.children.putIfAbsent(folder, new TrieNode(folder)); + curr = curr.children.get(folder); + } + } + + // Step 2: Serialize and collect duplicates + serialize(root); + + // Step 3: Mark duplicate folders + for (List group : serialMap.values()) { + if (group.size() > 1) { + for (TrieNode node : group) { + node.isDeleted = true; + } + } + } + + // Step 4: Collect remaining paths + List> result = new ArrayList<>(); + dfs(root, new ArrayList<>(), result); + return result; + } + + private String serialize(TrieNode node) { + if (node.children.isEmpty()) return ""; + + List parts = new ArrayList<>(); + for (String childName : node.children.keySet().stream().sorted().toList()) { + TrieNode child = node.children.get(childName); + String sub = serialize(child); + parts.add(childName + "[" + sub + "]"); + } + + String serial = String.join("", parts); + serialMap.computeIfAbsent(serial, k -> new ArrayList<>()).add(node); + return serial; + } + + private void dfs(TrieNode node, List path, List> result) { + for (TrieNode child : node.children.values()) { + if (!child.isDeleted) { + path.add(child.name); + result.add(new ArrayList<>(path)); + dfs(child, path, result); + path.remove(path.size() - 1); + } + } + } +}