@@ -5,11 +5,11 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/1900-1999/1948.De
5
5
rating : 2533
6
6
source : 第 251 场周赛 Q4
7
7
tags :
8
- - 字典树
9
- - 数组
10
- - 哈希表
11
- - 字符串
12
- - 哈希函数
8
+ - 字典树
9
+ - 数组
10
+ - 哈希表
11
+ - 字符串
12
+ - 哈希函数
13
13
---
14
14
15
15
<!-- problem:start -->
@@ -22,13 +22,27 @@ tags:
22
22
23
23
<!-- description:start -->
24
24
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 >
26
30
27
31
<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 >
29
36
</ul >
30
37
31
- <p >如果两个文件夹(不需要在同一层级)包含 <strong >非空且</strong ><b >相同的  ; </b >子文件夹  ; <strong >集合</strong > 并具有相同的子文件夹结构,则认为这两个文件夹是相同文件夹。相同文件夹的根层级 <strong >不</strong > 需要相同。如果存在两个(或两个以上)<strong >相同</strong > 文件夹,则需要将这些文件夹和所有它们的子文件夹 <strong >标记</strong > 为待删除。</p >
38
+ <p >
39
+ 如果两个文件夹(不需要在同一层级)包含 <strong >非空且</strong >
40
+ <b >相同的  ; </b >子文件夹  ; <strong >集合</strong >{" "}
41
+ 并具有相同的子文件夹结构,则认为这两个文件夹是相同文件夹。相同文件夹的根层级{" "}
42
+ <strong >不</strong > 需要相同。如果存在两个(或两个以上)<strong >相同</strong >{" "}
43
+ 文件夹,则需要将这些文件夹和所有它们的子文件夹 <strong >标记</strong >{" "}
44
+ 为待删除。
45
+ </p >
32
46
33
47
<ul >
34
48
<li>例如,下面文件结构中的文件夹 <code>"/a"</code> 和 <code>"/b"</code> 相同。它们(以及它们的子文件夹)应该被 <strong>全部</strong> 标记为待删除:
@@ -48,72 +62,136 @@ tags:
48
62
49
63
</ul >
50
64
51
- <p >一旦所有的相同文件夹和它们的子文件夹都被标记为待删除,文件系统将会 <strong >删除</strong > 所有上述文件夹。文件系统只会执行一次删除操作。执行完这一次删除操作后,不会删除新出现的相同文件夹。</p >
65
+ <p >
66
+ 一旦所有的相同文件夹和它们的子文件夹都被标记为待删除,文件系统将会{" "}
67
+ <strong >删除</strong >{" "}
68
+ 所有上述文件夹。文件系统只会执行一次删除操作。执行完这一次删除操作后,不会删除新出现的相同文件夹。
69
+ </p >
52
70
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 >
54
77
55
78
<p >  ; </p >
56
79
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
+ />
59
88
<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
+ 的空文件夹。
64
95
</pre >
65
96
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
+ />
68
105
<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
+ 在删除后变为相同文件夹,但这两个文件夹不会被删除,因为删除只会进行一次,且它们没有在删除前被标记。
74
113
</pre >
75
114
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
+ />
78
123
<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
+ 注意,返回的数组可以按不同顺序返回文件夹路径,因为题目对顺序没有要求。
83
128
</pre >
84
129
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
+ />
87
138
<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" 。
93
147
</pre >
94
148
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
+ />
97
157
<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
+ 不会被标记,因为相同子文件夹的集合必须是非空集合,但这两个文件夹都是空的。
103
165
</pre >
104
166
105
167
<p >  ; </p >
106
168
107
- <p ><strong >提示:</strong ></p >
169
+ <p >
170
+ <strong >提示:</strong >
171
+ </p >
108
172
109
173
<ul >
110
- <li><code>1 <= paths.length <= 2 * 10<sup>4</sup></code></li>
111
- <li><code>1 <= paths[i].length <= 500</code></li>
112
- <li><code>1 <= paths[i][j].length <= 10</code></li>
113
- <li><code>1 <= sum(paths[i][j].length) <= 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 <= paths.length <= 2 * 10<sup>4</sup>
177
+ </code>
178
+ </li >
179
+ <li >
180
+ <code>1 <= paths[i].length <= 500</code>
181
+ </li >
182
+ <li >
183
+ <code>1 <= paths[i][j].length <= 10</code>
184
+ </li >
185
+ <li >
186
+ <code>
187
+ 1 <= sum(paths[i][j].length) <= 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 >
117
195
</ul >
118
196
119
197
<!-- description:end -->
@@ -381,4 +459,4 @@ func deleteDuplicateFolder(paths [][]string) [][]string {
381
459
382
460
<!-- solution:end -->
383
461
384
- <!-- problem:end -->
462
+ <!-- problem:end -->
0 commit comments