From 385da57d057ee8cf1f371cbebdba62880b687507 Mon Sep 17 00:00:00 2001 From: Rajender Thota Date: Sat, 19 Jul 2025 22:09:52 -0400 Subject: [PATCH 1/4] Create Solution.java 1948. Delete Duplicate Folders in System java solution --- .../Solution.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 solution/1900-1999/1948.Delete Duplicate Folders in System/Solution.java 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); + } + } + } +} From d25460dae1c7f8e96ab76290cbadf700e9f794ac Mon Sep 17 00:00:00 2001 From: Rajender Thota Date: Sat, 19 Jul 2025 22:38:02 -0400 Subject: [PATCH 2/4] Update README.md java solution added --- .../README.md | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) 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..74e9ab3624590 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); + } + } + } +} ``` From db9eb438f7e003a7f1b91e22dd92cfb6136d1307 Mon Sep 17 00:00:00 2001 From: Rajender Thota Date: Sat, 19 Jul 2025 22:39:29 -0400 Subject: [PATCH 3/4] Update README_EN.md java solution --- .../README_EN.md | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) 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..8593ab6b5d9bc 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); + } + } + } +} ``` From f83ac583ec24e15aee4b986b1af4a065dfdcacb8 Mon Sep 17 00:00:00 2001 From: rajenderthota <8196242+rajenderthota@users.noreply.github.com> Date: Sun, 20 Jul 2025 02:45:25 +0000 Subject: [PATCH 4/4] style: format code and docs with prettier --- .../1900-1999/1948.Delete Duplicate Folders in System/README.md | 2 +- .../1948.Delete Duplicate Folders in System/README_EN.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 74e9ab3624590..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 @@ -150,7 +150,7 @@ class Solution { public List> deleteDuplicateFolder(List> paths) { TrieNode root = new TrieNode(""); - + // Step 1: Build the folder trie for (List path : paths) { TrieNode curr = root; 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 8593ab6b5d9bc..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 @@ -129,7 +129,7 @@ class Solution { public List> deleteDuplicateFolder(List> paths) { TrieNode root = new TrieNode(""); - + // Step 1: Build the folder trie for (List path : paths) { TrieNode curr = root;