题目: 删除子文件夹
- 你是一位系统管理员,手里有一份文件夹列表 folder,你的任务是要删除该列表中的所有 子文件夹,并以 任意顺序 返回剩下的文件夹。
- 我们这样定义「子文件夹」:
- 如果文件夹
folder[i]
位于另一个文件夹folder[j]
下,那么folder[i]
就是folder[j]
的子文件夹。 文件夹的「路径」是由一个或多个按以下格式串联形成的字符串: /
后跟一个或者多个小写英文字母。 例如,/leetcode
和/leetcode/problems
都是有效的路径,而空字符串和/
不是。
示例 1:
输入:folder = ["/a","/a/b","/c/d","/c/d/e","/c/f"]
输出:["/a","/c/d","/c/f"]
解释:"/a/b/" 是 "/a" 的子文件夹,而 "/c/d/e" 是 "/c/d" 的子文件夹。
示例 2:
输入:folder = ["/a","/a/b/c","/a/b/d"]
输出:["/a"]
解释:文件夹 "/a/b/c" 和 "/a/b/d/" 都会被删除,因为它们都是 "/a" 的子文件夹。
示例 3:
输入:folder = ["/a/b/c","/a/b/d","/a/b/ca"]
输出:["/a/b/c","/a/b/ca","/a/b/d"]
提示:
- 1 <=
folder.length
<= 4 * 10^4 - 2 <=
folder[i].length
<= 100 folder[i]
只包含小写字母和 /folder[i]
总是以字符/
起始- 每个文件夹名都是唯一的
来源:力扣(LeetCode)第5231题(临时)
链接:https://leetcode-cn.com/problems/remove-sub-folders-from-the-filesystem
分析:
- 只要将数组排序一下,就能很轻松的解决。
- 排序后所有的子文件夹都会跟在父文件夹后面,只要判断一下前缀是否一样就行了。
代码:
class Solution:
def removeSubfolders(self, folder: List[str]) -> List[str]:
folder.sort() # 先排序,让数组中相同的文件夹从少到多放在一起。
res = []
t = '//' # 初始化
for f in folder:
if not f.startswith(t): # 判断是否包含前一个元素的部分
res.append(f) # 如果不包含,那么就不是子文件夹,放入答案中
t = f + '/' # 将当前元素传给t,用于下一轮循环比较。
return res
class Solution {
public List<String> removeSubfolders(String[] folder) {
Arrays.sort(folder);
List<String> ans = new ArrayList();
String str = "//";
for (String f : folder) {
if (!startsWith(f, str)) {
ans.add(f);
str = f + "/";
}
}
return ans;
}
public boolean startsWith(String str, String sub) {
for (int i = 0; i < sub.length(); i++) {
if (str.charAt(i) != sub.charAt(i)) return false;
}
return true;
}
}