Skip to content

Commit 9862d73

Browse files
feat: add solutions to lc problem: No.1948
1 parent 78a3359 commit 9862d73

File tree

2 files changed

+247
-91
lines changed

2 files changed

+247
-91
lines changed

solution/1900-1999/1948.Delete Duplicate Folders in System/README.md

Lines changed: 130 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/1900-1999/1948.De
55
rating: 2533
66
source: 第 251 场周赛 Q4
77
tags:
8-
- 字典树
9-
- 数组
10-
- 哈希表
11-
- 字符串
12-
- 哈希函数
8+
- 字典树
9+
- 数组
10+
- 哈希表
11+
- 字符串
12+
- 哈希函数
1313
---
1414

1515
<!-- problem:start -->
@@ -22,13 +22,27 @@ tags:
2222

2323
<!-- description:start -->
2424

25-
<p>由于一个漏洞,文件系统中存在许多重复文件夹。给你一个二维数组 <code>paths</code>,其中 <code>paths[i]</code> 是一个表示文件系统中第 <code>i</code> 个文件夹的绝对路径的数组。</p>
25+
<p>
26+
由于一个漏洞,文件系统中存在许多重复文件夹。给你一个二维数组{" "}
27+
<code>paths</code>,其中 <code>paths[i]</code> 是一个表示文件系统中第{" "}
28+
<code>i</code> 个文件夹的绝对路径的数组。
29+
</p>
2630

2731
<ul>
28-
<li>例如,<code>["one", "two", "three"]</code> 表示路径 <code>"/one/two/three"</code> 。</li>
32+
<li>
33+
例如,<code>["one", "two", "three"]</code> 表示路径{" "}
34+
<code>"/one/two/three"</code> 。
35+
</li>
2936
</ul>
3037

31-
<p>如果两个文件夹(不需要在同一层级)包含 <strong>非空且</strong><b>相同的&nbsp;</b>子文件夹&nbsp;<strong>集合</strong> 并具有相同的子文件夹结构,则认为这两个文件夹是相同文件夹。相同文件夹的根层级 <strong>不</strong> 需要相同。如果存在两个(或两个以上)<strong>相同</strong> 文件夹,则需要将这些文件夹和所有它们的子文件夹 <strong>标记</strong> 为待删除。</p>
38+
<p>
39+
如果两个文件夹(不需要在同一层级)包含 <strong>非空且</strong>
40+
<b>相同的&nbsp;</b>子文件夹&nbsp;<strong>集合</strong>{" "}
41+
并具有相同的子文件夹结构,则认为这两个文件夹是相同文件夹。相同文件夹的根层级{" "}
42+
<strong>不</strong> 需要相同。如果存在两个(或两个以上)<strong>相同</strong>{" "}
43+
文件夹,则需要将这些文件夹和所有它们的子文件夹 <strong>标记</strong>{" "}
44+
为待删除。
45+
</p>
3246

3347
<ul>
3448
<li>例如,下面文件结构中的文件夹 <code>"/a"</code> 和 <code>"/b"</code> 相同。它们(以及它们的子文件夹)应该被 <strong>全部</strong> 标记为待删除:
@@ -48,72 +62,136 @@ tags:
4862

4963
</ul>
5064

51-
<p>一旦所有的相同文件夹和它们的子文件夹都被标记为待删除,文件系统将会 <strong>删除</strong> 所有上述文件夹。文件系统只会执行一次删除操作。执行完这一次删除操作后,不会删除新出现的相同文件夹。</p>
65+
<p>
66+
一旦所有的相同文件夹和它们的子文件夹都被标记为待删除,文件系统将会{" "}
67+
<strong>删除</strong>{" "}
68+
所有上述文件夹。文件系统只会执行一次删除操作。执行完这一次删除操作后,不会删除新出现的相同文件夹。
69+
</p>
5270

53-
<p>返回二维数组<em> </em><code>ans</code> ,该数组包含删除所有标记文件夹之后剩余文件夹的路径。路径可以按 <strong>任意顺序</strong> 返回。</p>
71+
<p>
72+
返回二维数组<em> </em>
73+
<code>ans</code>{" "}
74+
,该数组包含删除所有标记文件夹之后剩余文件夹的路径。路径可以按{" "}
75+
<strong>任意顺序</strong> 返回。
76+
</p>
5477

5578
<p>&nbsp;</p>
5679

57-
<p><strong>示例 1:</strong></p>
58-
<img alt="" src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/1900-1999/1948.Delete%20Duplicate%20Folders%20in%20System/images/lc-dupfolder1.jpg" style="width: 200px; height: 218px;" />
80+
<p>
81+
<strong>示例 1:</strong>
82+
</p>
83+
<img
84+
alt=""
85+
src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/1900-1999/1948.Delete%20Duplicate%20Folders%20in%20System/images/lc-dupfolder1.jpg"
86+
style="width: 200px; height: 218px;"
87+
/>
5988
<pre>
60-
<strong>输入:</strong>paths = [["a"],["c"],["d"],["a","b"],["c","b"],["d","a"]]
61-
<strong>输出:</strong>[["d"],["d","a"]]
62-
<strong>解释:</strong>文件结构如上所示。
63-
文件夹 "/a" 和 "/c"(以及它们的子文件夹)都会被标记为待删除,因为它们都包含名为 "b" 的空文件夹。
89+
<strong>输入:</strong>paths =
90+
[["a"],["c"],["d"],["a","b"],["c","b"],["d","a"]]
91+
<strong>输出:</strong>[["d"],["d","a"]]
92+
<strong>解释:</strong>文件结构如上所示。 文件夹 "/a" 和
93+
"/c"(以及它们的子文件夹)都会被标记为待删除,因为它们都包含名为 "b"
94+
的空文件夹。
6495
</pre>
6596

66-
<p><strong>示例 2:</strong></p>
67-
<img alt="" src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/1900-1999/1948.Delete%20Duplicate%20Folders%20in%20System/images/lc-dupfolder2.jpg" style="width: 200px; height: 355px;" />
97+
<p>
98+
<strong>示例 2:</strong>
99+
</p>
100+
<img
101+
alt=""
102+
src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/1900-1999/1948.Delete%20Duplicate%20Folders%20in%20System/images/lc-dupfolder2.jpg"
103+
style="width: 200px; height: 355px;"
104+
/>
68105
<pre>
69-
<strong>输入:</strong>paths = [["a"],["c"],["a","b"],["c","b"],["a","b","x"],["a","b","x","y"],["w"],["w","y"]]
70-
<strong>输出:</strong>[["c"],["c","b"],["a"],["a","b"]]
71-
<strong>解释:</strong>文件结构如上所示。
72-
文件夹 "/a/b/x" 和 "/w"(以及它们的子文件夹)都会被标记为待删除,因为它们都包含名为 "y" 的空文件夹。
73-
注意,文件夹 "/a" 和 "/c" 在删除后变为相同文件夹,但这两个文件夹不会被删除,因为删除只会进行一次,且它们没有在删除前被标记。
106+
<strong>输入:</strong>paths =
107+
[["a"],["c"],["a","b"],["c","b"],["a","b","x"],["a","b","x","y"],["w"],["w","y"]]
108+
<strong>输出:</strong>[["c"],["c","b"],["a"],["a","b"]]
109+
<strong>解释:</strong>文件结构如上所示。 文件夹 "/a/b/x" 和
110+
"/w"(以及它们的子文件夹)都会被标记为待删除,因为它们都包含名为 "y"
111+
的空文件夹。 注意,文件夹 "/a" 和 "/c"
112+
在删除后变为相同文件夹,但这两个文件夹不会被删除,因为删除只会进行一次,且它们没有在删除前被标记。
74113
</pre>
75114

76-
<p><strong>示例 3:</strong></p>
77-
<img alt="" src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/1900-1999/1948.Delete%20Duplicate%20Folders%20in%20System/images/lc-dupfolder3.jpg" style="width: 200px; height: 201px;" />
115+
<p>
116+
<strong>示例 3:</strong>
117+
</p>
118+
<img
119+
alt=""
120+
src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/1900-1999/1948.Delete%20Duplicate%20Folders%20in%20System/images/lc-dupfolder3.jpg"
121+
style="width: 200px; height: 201px;"
122+
/>
78123
<pre>
79-
<strong>输入:</strong>paths = [["a","b"],["c","d"],["c"],["a"]]
80-
<strong>输出:</strong>[["c"],["c","d"],["a"],["a","b"]]
81-
<strong>解释:</strong>文件系统中所有文件夹互不相同。
82-
注意,返回的数组可以按不同顺序返回文件夹路径,因为题目对顺序没有要求。
124+
<strong>输入:</strong>paths = [["a","b"],["c","d"],["c"],["a"]]
125+
<strong>输出:</strong>[["c"],["c","d"],["a"],["a","b"]]
126+
<strong>解释:</strong>文件系统中所有文件夹互不相同。
127+
注意,返回的数组可以按不同顺序返回文件夹路径,因为题目对顺序没有要求。
83128
</pre>
84129

85-
<p><strong>示例 4:</strong></p>
86-
<img alt="" src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/1900-1999/1948.Delete%20Duplicate%20Folders%20in%20System/images/lc-dupfolder4_.jpg" style="width: 300px; height: 290px;" />
130+
<p>
131+
<strong>示例 4:</strong>
132+
</p>
133+
<img
134+
alt=""
135+
src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/1900-1999/1948.Delete%20Duplicate%20Folders%20in%20System/images/lc-dupfolder4_.jpg"
136+
style="width: 300px; height: 290px;"
137+
/>
87138
<pre>
88-
<strong>输入:</strong>paths = [["a"],["a","x"],["a","x","y"],["a","z"],["b"],["b","x"],["b","x","y"],["b","z"]]
89-
<strong>输出:</strong>[]
90-
<strong>解释:</strong>文件结构如上所示。
91-
文件夹 "/a/x" 和 "/b/x"(以及它们的子文件夹)都会被标记为待删除,因为它们都包含名为 "y" 的空文件夹。
92-
文件夹 "/a" 和 "/b"(以及它们的子文件夹)都会被标记为待删除,因为它们都包含一个名为 "z" 的空文件夹以及上面提到的文件夹 "x" 。
139+
<strong>输入:</strong>paths =
140+
[["a"],["a","x"],["a","x","y"],["a","z"],["b"],["b","x"],["b","x","y"],["b","z"]]
141+
<strong>输出:</strong>[]
142+
<strong>解释:</strong>文件结构如上所示。 文件夹 "/a/x" 和
143+
"/b/x"(以及它们的子文件夹)都会被标记为待删除,因为它们都包含名为 "y"
144+
的空文件夹。 文件夹 "/a" 和
145+
"/b"(以及它们的子文件夹)都会被标记为待删除,因为它们都包含一个名为 "z"
146+
的空文件夹以及上面提到的文件夹 "x" 。
93147
</pre>
94148

95-
<p><strong>示例 5:</strong></p>
96-
<img alt="" src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/1900-1999/1948.Delete%20Duplicate%20Folders%20in%20System/images/lc-dupfolder5_.jpg" style="width: 300px; height: 282px;" />
149+
<p>
150+
<strong>示例 5:</strong>
151+
</p>
152+
<img
153+
alt=""
154+
src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/1900-1999/1948.Delete%20Duplicate%20Folders%20in%20System/images/lc-dupfolder5_.jpg"
155+
style="width: 300px; height: 282px;"
156+
/>
97157
<pre>
98-
<strong>输入:</strong>paths = [["a"],["a","x"],["a","x","y"],["a","z"],["b"],["b","x"],["b","x","y"],["b","z"],["b","w"]]
99-
<strong>输出:</strong>[["b"],["b","w"],["b","z"],["a"],["a","z"]]
100-
<strong>解释:</strong>本例与上例的结构基本相同,除了新增 "/b/w" 文件夹。
101-
文件夹 "/a/x" 和 "/b/x" 仍然会被标记,但 "/a" 和 "/b" 不再被标记,因为 "/b" 中有名为 "w" 的空文件夹而 "/a" 没有。
102-
注意,"/a/z" 和 "/b/z" 不会被标记,因为相同子文件夹的集合必须是非空集合,但这两个文件夹都是空的。
158+
<strong>输入:</strong>paths =
159+
[["a"],["a","x"],["a","x","y"],["a","z"],["b"],["b","x"],["b","x","y"],["b","z"],["b","w"]]
160+
<strong>输出:</strong>[["b"],["b","w"],["b","z"],["a"],["a","z"]]
161+
<strong>解释:</strong>本例与上例的结构基本相同,除了新增 "/b/w" 文件夹。
162+
文件夹 "/a/x" 和 "/b/x" 仍然会被标记,但 "/a" 和 "/b" 不再被标记,因为 "/b"
163+
中有名为 "w" 的空文件夹而 "/a" 没有。 注意,"/a/z" 和 "/b/z"
164+
不会被标记,因为相同子文件夹的集合必须是非空集合,但这两个文件夹都是空的。
103165
</pre>
104166

105167
<p>&nbsp;</p>
106168

107-
<p><strong>提示:</strong></p>
169+
<p>
170+
<strong>提示:</strong>
171+
</p>
108172

109173
<ul>
110-
<li><code>1 &lt;= paths.length &lt;= 2 * 10<sup>4</sup></code></li>
111-
<li><code>1 &lt;= paths[i].length &lt;= 500</code></li>
112-
<li><code>1 &lt;= paths[i][j].length &lt;= 10</code></li>
113-
<li><code>1 &lt;= sum(paths[i][j].length) &lt;= 2 * 10<sup>5</sup></code></li>
114-
<li><code>path[i][j]</code> 由小写英文字母组成</li>
115-
<li>不会存在两个路径都指向同一个文件夹的情况</li>
116-
<li>对于不在根层级的任意文件夹,其父文件夹也会包含在输入中</li>
174+
<li>
175+
<code>
176+
1 &lt;= paths.length &lt;= 2 * 10<sup>4</sup>
177+
</code>
178+
</li>
179+
<li>
180+
<code>1 &lt;= paths[i].length &lt;= 500</code>
181+
</li>
182+
<li>
183+
<code>1 &lt;= paths[i][j].length &lt;= 10</code>
184+
</li>
185+
<li>
186+
<code>
187+
1 &lt;= sum(paths[i][j].length) &lt;= 2 * 10<sup>5</sup>
188+
</code>
189+
</li>
190+
<li>
191+
<code>path[i][j]</code> 由小写英文字母组成
192+
</li>
193+
<li>不会存在两个路径都指向同一个文件夹的情况</li>
194+
<li>对于不在根层级的任意文件夹,其父文件夹也会包含在输入中</li>
117195
</ul>
118196

119197
<!-- description:end -->
@@ -381,4 +459,4 @@ func deleteDuplicateFolder(paths [][]string) [][]string {
381459

382460
<!-- solution:end -->
383461

384-
<!-- problem:end -->
462+
<!-- problem:end -->

0 commit comments

Comments
 (0)