Skip to content

Commit c1281dc

Browse files
Merge branch 'main' into main
2 parents 9862d73 + d369cf9 commit c1281dc

File tree

2 files changed

+122
-0
lines changed

2 files changed

+122
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
type TrieNode struct {
2+
children map[string]*TrieNode
3+
key string
4+
deleted bool
5+
}
6+
7+
func deleteDuplicateFolder(paths [][]string) [][]string {
8+
root := &TrieNode{children: make(map[string]*TrieNode)}
9+
10+
for _, path := range paths {
11+
current := root
12+
for _, folder := range path {
13+
if _, ok := current.children[folder]; !ok {
14+
current.children[folder] = &TrieNode{
15+
children: make(map[string]*TrieNode),
16+
key: folder,
17+
}
18+
}
19+
current = current.children[folder]
20+
}
21+
}
22+
23+
seen := make(map[string]*TrieNode)
24+
var dfs func(*TrieNode) string
25+
dfs = func(node *TrieNode) string {
26+
if node == nil || len(node.children) == 0 {
27+
return ""
28+
}
29+
30+
var keys []string
31+
for key, child := range node.children {
32+
serialized := dfs(child)
33+
keys = append(keys, key+"("+serialized+")")
34+
}
35+
sort.Strings(keys)
36+
serialized := strings.Join(keys, "")
37+
38+
if existing, ok := seen[serialized]; ok {
39+
existing.deleted = true
40+
node.deleted = true
41+
} else {
42+
seen[serialized] = node
43+
}
44+
45+
return serialized
46+
}
47+
dfs(root)
48+
49+
var result [][]string
50+
var path []string
51+
var collect func(*TrieNode)
52+
collect = func(node *TrieNode) {
53+
if node.deleted {
54+
return
55+
}
56+
if len(path) > 0 {
57+
newPath := make([]string, len(path))
58+
copy(newPath, path)
59+
result = append(result, newPath)
60+
}
61+
for key, child := range node.children {
62+
path = append(path, key)
63+
collect(child)
64+
path = path[:len(path)-1]
65+
}
66+
}
67+
collect(root)
68+
69+
return result
70+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
class TrieNode:
2+
def __init__(self):
3+
self.children = collections.defaultdict(TrieNode)
4+
self.key = ""
5+
self.deleted = False
6+
7+
8+
class Solution:
9+
def deleteDuplicateFolder(self, paths: List[List[str]]) -> List[List[str]]:
10+
root = TrieNode()
11+
12+
for path in paths:
13+
current = root
14+
for folder in path:
15+
current = current.children[folder]
16+
current.key = folder
17+
18+
seen = collections.defaultdict(list)
19+
20+
def dfs(node):
21+
if not node.children:
22+
return ""
23+
keys = []
24+
for key, child in node.children.items():
25+
serialized = dfs(child)
26+
keys.append(f"{key}({serialized})")
27+
keys.sort()
28+
serialized = "".join(keys)
29+
if len(seen[serialized]) > 0:
30+
for duplicate in seen[serialized]:
31+
duplicate.deleted = True
32+
node.deleted = True
33+
seen[serialized].append(node)
34+
return serialized
35+
36+
dfs(root)
37+
38+
result = []
39+
path = []
40+
41+
def collect(node):
42+
if node.deleted:
43+
return
44+
if path:
45+
result.append(path.copy())
46+
for key, child in node.children.items():
47+
path.append(key)
48+
collect(child)
49+
path.pop()
50+
51+
collect(root)
52+
return result

0 commit comments

Comments
 (0)