@@ -5,11 +5,11 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/1900-1999/1948.De
55rating : 2533
66source : 第 251 场周赛 Q4
77tags :
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 >相同的  ; </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 >
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 >  ; </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 >  ; </p >
106168
107- <p ><strong >提示:</strong ></p >
169+ <p >
170+ <strong >提示:</strong >
171+ </p >
108172
109173<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 >
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