Сложность: medium
Получив список paths информации о каталоге, включающий путь к каталогу и все файлы с содержимым в этом каталоге, верните все дубликаты файлов в файловой системе по их путям. Вы можете вернуть ответ в любом порядке. Группа дубликатов состоит как минимум из двух файлов с одинаковым содержимым. Одна строка информации о каталоге во входном списке имеет следующий формат: "root/d1/d2/.../dm f1.txt(f1_content) f2.txt(f2_content) ... fn.txt(fn_content)" Это означает, что в каталоге "root/d1/d2/.../dm" имеется n файлов (f1.txt, f2.txt ... fn.txt) с содержимым (f1_content, f2_content ... fn_content) соответственно. Обратите внимание, что n >= 1 и m >= 0. Если m = 0, это означает, что каталог является только корневым. На выходе получается список групп дублирующихся путей к файлам. Для каждой группы он содержит все пути к файлам, которые имеют одинаковое содержимое. Путь к файлу - это строка, имеющая следующий формат: "каталог_путь/имя_файла.txt".
Пример:
Input: paths = ["root/a 1.txt(abcd) 2.txt(efgh)","root/c 3.txt(abcd)","root/c/d 4.txt(efgh)","root 4.txt(efgh)"]
Output: [["root/a/2.txt","root/c/d/4.txt","root/4.txt"],["root/a/1.txt","root/c/3.txt"]]
👨💻 Алгоритм:
1⃣Пройдите по списку путей, разберите каждый путь и соберите информацию о содержимом файлов и соответствующих им путях.
2⃣Используйте словарь для хранения списков путей файлов, сгруппированных по их содержимому.
3⃣Пройдите по словарю и соберите группы дубликатов, содержащие как минимум два пути.
😎 Решение:
public class Solution {
public IList<IList<string>> FindDuplicate(string[] paths) {
var contentToFilePaths = new Dictionary<string, List<string>>();
foreach (var path in paths) {
var parts = path.Split(' ');
var root = parts[0];
for (int i = 1; i < parts.Length; i++) {
var fileParts = parts[i].Split('(');
var fileName = fileParts[0];
var content = fileParts[1].TrimEnd(')');
var filePath = $"{root}/{fileName}";
if (!contentToFilePaths.ContainsKey(content)) {
contentToFilePaths[content] = new List<string>();
}
contentToFilePaths[content].Add(filePath);
}
}
var result = new List<IList<string>>();
foreach (var kvp in contentToFilePaths) {
if (kvp.Value.Count > 1) {
result.Add(kvp.Value);
}
}
return result;
}
}Ставь 👍 и забирай 📚 Базу знаний
