Skip to content

Commit cf9d2c6

Browse files
committed
feat: add solutions to lc problem: No.1233
No.1233.Remove Sub-Folders from the Filesystem
1 parent 8ef770d commit cf9d2c6

File tree

5 files changed

+409
-2
lines changed

5 files changed

+409
-2
lines changed

solution/1200-1299/1233.Remove Sub-Folders from the Filesystem/README.md

Lines changed: 139 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,22 +56,160 @@
5656

5757
<!-- 这里可写通用的实现逻辑 -->
5858

59+
**方法一:排序 + 前缀树**
60+
5961
<!-- tabs:start -->
6062

6163
### **Python3**
6264

6365
<!-- 这里可写当前语言的特殊实现逻辑 -->
6466

6567
```python
66-
68+
class Trie:
69+
def __init__(self):
70+
self.children = {}
71+
self.is_end = False
72+
73+
def insert(self, w):
74+
node = self
75+
ps = w.split('/')
76+
for p in ps[1:]:
77+
if p not in node.children:
78+
node.children[p] = Trie()
79+
node = node.children[p]
80+
node.is_end = True
81+
82+
def search(self, w):
83+
node = self
84+
ps = w.split('/')
85+
for p in ps[1:]:
86+
if p not in node.children:
87+
return False
88+
node = node.children[p]
89+
if node.is_end:
90+
return True
91+
return False
92+
93+
94+
class Solution:
95+
def removeSubfolders(self, folder: List[str]) -> List[str]:
96+
trie = Trie()
97+
folder.sort(key=lambda x: len(x.split('/')))
98+
ans = []
99+
for v in folder:
100+
if not trie.search(v):
101+
trie.insert(v)
102+
ans.append(v)
103+
return ans
67104
```
68105

69106
### **Java**
70107

71108
<!-- 这里可写当前语言的特殊实现逻辑 -->
72109

73110
```java
111+
class Trie {
112+
Map<String, Trie> children = new HashMap<>();
113+
boolean isEnd;
114+
115+
void insert(String w) {
116+
Trie node = this;
117+
String[] ps = w.split("/");
118+
for (int i = 1; i < ps.length; ++i) {
119+
String p = ps[i];
120+
if (!node.children.containsKey(p)) {
121+
node.children.put(p, new Trie());
122+
}
123+
node = node.children.get(p);
124+
}
125+
node.isEnd = true;
126+
}
127+
128+
boolean search(String w) {
129+
Trie node = this;
130+
String[] ps = w.split("/");
131+
for (int i = 1; i < ps.length; ++i) {
132+
String p = ps[i];
133+
if (!node.children.containsKey(p)) {
134+
return false;
135+
}
136+
node = node.children.get(p);
137+
if (node.isEnd) {
138+
return true;
139+
}
140+
}
141+
return false;
142+
}
143+
}
144+
145+
class Solution {
146+
public List<String> removeSubfolders(String[] folder) {
147+
Arrays.sort(folder, (a, b) -> a.split("/").length - b.split("/").length);
148+
Trie trie = new Trie();
149+
List<String> ans = new ArrayList<>();
150+
for (String v : folder) {
151+
if (!trie.search(v)) {
152+
trie.insert(v);
153+
ans.add(v);
154+
}
155+
}
156+
return ans;
157+
}
158+
}
159+
```
74160

161+
### **Go**
162+
163+
```go
164+
type Trie struct {
165+
children map[string]*Trie
166+
isEnd bool
167+
}
168+
169+
func newTrie() *Trie {
170+
m := map[string]*Trie{}
171+
return &Trie{children: m}
172+
}
173+
174+
func (this *Trie) insert(w string) {
175+
node := this
176+
for _, p := range strings.Split(w, "/")[1:] {
177+
if _, ok := node.children[p]; !ok {
178+
node.children[p] = newTrie()
179+
}
180+
node, _ = node.children[p]
181+
}
182+
node.isEnd = true
183+
}
184+
185+
func (this *Trie) search(w string) bool {
186+
node := this
187+
for _, p := range strings.Split(w, "/")[1:] {
188+
if _, ok := node.children[p]; !ok {
189+
return false
190+
}
191+
node, _ = node.children[p]
192+
if node.isEnd {
193+
return true
194+
}
195+
}
196+
return false
197+
}
198+
199+
func removeSubfolders(folder []string) []string {
200+
sort.Slice(folder, func(i, j int) bool {
201+
return len(strings.Split(folder[i], "/")) < len(strings.Split(folder[j], "/"))
202+
})
203+
trie := newTrie()
204+
var ans []string
205+
for _, v := range folder {
206+
if !trie.search(v) {
207+
trie.insert(v)
208+
ans = append(ans, v)
209+
}
210+
}
211+
return ans
212+
}
75213
```
76214

77215
### **...**

solution/1200-1299/1233.Remove Sub-Folders from the Filesystem/README_EN.md

Lines changed: 137 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,149 @@
5656
### **Python3**
5757

5858
```python
59-
59+
class Trie:
60+
def __init__(self):
61+
self.children = {}
62+
self.is_end = False
63+
64+
def insert(self, w):
65+
node = self
66+
ps = w.split('/')
67+
for p in ps[1:]:
68+
if p not in node.children:
69+
node.children[p] = Trie()
70+
node = node.children[p]
71+
node.is_end = True
72+
73+
def search(self, w):
74+
node = self
75+
ps = w.split('/')
76+
for p in ps[1:]:
77+
if p not in node.children:
78+
return False
79+
node = node.children[p]
80+
if node.is_end:
81+
return True
82+
return False
83+
84+
85+
class Solution:
86+
def removeSubfolders(self, folder: List[str]) -> List[str]:
87+
trie = Trie()
88+
folder.sort(key=lambda x: len(x.split('/')))
89+
ans = []
90+
for v in folder:
91+
if not trie.search(v):
92+
trie.insert(v)
93+
ans.append(v)
94+
return ans
6095
```
6196

6297
### **Java**
6398

6499
```java
100+
class Trie {
101+
Map<String, Trie> children = new HashMap<>();
102+
boolean isEnd;
103+
104+
void insert(String w) {
105+
Trie node = this;
106+
String[] ps = w.split("/");
107+
for (int i = 1; i < ps.length; ++i) {
108+
String p = ps[i];
109+
if (!node.children.containsKey(p)) {
110+
node.children.put(p, new Trie());
111+
}
112+
node = node.children.get(p);
113+
}
114+
node.isEnd = true;
115+
}
116+
117+
boolean search(String w) {
118+
Trie node = this;
119+
String[] ps = w.split("/");
120+
for (int i = 1; i < ps.length; ++i) {
121+
String p = ps[i];
122+
if (!node.children.containsKey(p)) {
123+
return false;
124+
}
125+
node = node.children.get(p);
126+
if (node.isEnd) {
127+
return true;
128+
}
129+
}
130+
return false;
131+
}
132+
}
133+
134+
class Solution {
135+
public List<String> removeSubfolders(String[] folder) {
136+
Arrays.sort(folder, (a, b) -> a.split("/").length - b.split("/").length);
137+
Trie trie = new Trie();
138+
List<String> ans = new ArrayList<>();
139+
for (String v : folder) {
140+
if (!trie.search(v)) {
141+
trie.insert(v);
142+
ans.add(v);
143+
}
144+
}
145+
return ans;
146+
}
147+
}
148+
```
65149

150+
### **Go**
151+
152+
```go
153+
type Trie struct {
154+
children map[string]*Trie
155+
isEnd bool
156+
}
157+
158+
func newTrie() *Trie {
159+
m := map[string]*Trie{}
160+
return &Trie{children: m}
161+
}
162+
163+
func (this *Trie) insert(w string) {
164+
node := this
165+
for _, p := range strings.Split(w, "/")[1:] {
166+
if _, ok := node.children[p]; !ok {
167+
node.children[p] = newTrie()
168+
}
169+
node, _ = node.children[p]
170+
}
171+
node.isEnd = true
172+
}
173+
174+
func (this *Trie) search(w string) bool {
175+
node := this
176+
for _, p := range strings.Split(w, "/")[1:] {
177+
if _, ok := node.children[p]; !ok {
178+
return false
179+
}
180+
node, _ = node.children[p]
181+
if node.isEnd {
182+
return true
183+
}
184+
}
185+
return false
186+
}
187+
188+
func removeSubfolders(folder []string) []string {
189+
sort.Slice(folder, func(i, j int) bool {
190+
return len(strings.Split(folder[i], "/")) < len(strings.Split(folder[j], "/"))
191+
})
192+
trie := newTrie()
193+
var ans []string
194+
for _, v := range folder {
195+
if !trie.search(v) {
196+
trie.insert(v)
197+
ans = append(ans, v)
198+
}
199+
}
200+
return ans
201+
}
66202
```
67203

68204
### **...**
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
type Trie struct {
2+
children map[string]*Trie
3+
isEnd bool
4+
}
5+
6+
func newTrie() *Trie {
7+
m := map[string]*Trie{}
8+
return &Trie{children: m}
9+
}
10+
11+
func (this *Trie) insert(w string) {
12+
node := this
13+
for _, p := range strings.Split(w, "/")[1:] {
14+
if _, ok := node.children[p]; !ok {
15+
node.children[p] = newTrie()
16+
}
17+
node, _ = node.children[p]
18+
}
19+
node.isEnd = true
20+
}
21+
22+
func (this *Trie) search(w string) bool {
23+
node := this
24+
for _, p := range strings.Split(w, "/")[1:] {
25+
if _, ok := node.children[p]; !ok {
26+
return false
27+
}
28+
node, _ = node.children[p]
29+
if node.isEnd {
30+
return true
31+
}
32+
}
33+
return false
34+
}
35+
36+
func removeSubfolders(folder []string) []string {
37+
sort.Slice(folder, func(i, j int) bool {
38+
return len(strings.Split(folder[i], "/")) < len(strings.Split(folder[j], "/"))
39+
})
40+
trie := newTrie()
41+
var ans []string
42+
for _, v := range folder {
43+
if !trie.search(v) {
44+
trie.insert(v)
45+
ans = append(ans, v)
46+
}
47+
}
48+
return ans
49+
}

0 commit comments

Comments
 (0)