Elimina Sub-Directorios del sistema de archivos
Dada una lista de directorios llamada folder, retorna los directorios después de eliminar todos los sub-directorios. Puedes retornar la respuesta en cualquier órden Si un directorio en la posicion i se encuentra dentro de otro directorio en la posición j, el directorio es un sub-directorio. Un sub-directorio de folder[j] debe iniciar con folder[j], seguido de un '/'. Por ejemplo, '/a/b' es un sub-directorio de '/a', pero '/b' no es un sub-directorio de '/a/b/c'. El formato de la ruta es uno o más cadenas concatenadas de la forma: '/' seguido de uno o más letras minúsculas en Inglés. Por ejemplo, '/leetcode' y '/leetcode/problems' son rutas válidas, mientras que una cadena vacÃa y '/' no lo son.
Ejemplo 1:
Entrada:
folder = ["/a","/a/b","/c/d","/c/d/e","/c/f"]
Salida:
["/a", "/c/d", "/c/f"]
Explicación:
El directorio "/a/b" es un sub-directorio de "/a". Mientras que "/c/d/e" se encuentra dentro del directorio "/c/d" en nuestro sistema de archivos.
Ejemplo 2:
Entrada:
folder = ["/a", "/a/b/c", "/a/b/d"]
Salida:
["/a"]
Explicación:
Los directorios "/a/b/c" y "/a/b/d" serán eliminados porque son sub-directorios de "/a".
Ejemplo 3:
Entrada:
folder = ["/a/b/c", "/a/b/ca", "/a/b/d"]
Salida:
["/a/b/c", "/a/b/ca", "/a/b/d"]
Condiciones:
1 <= folder.length <= 4 * 104
2 <= folder[i].length <= 100
folder[i]
contiene sólo letras minúsculas y'/'
.folder[i]
siempre inicia con el carácter'/'
.- Cada nombre de directorio es único.
Solución
#include <iostream>
#include <ranges>
#include <cassert>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <string_view>
using namespace std;
class Solution {
public:
vector<string> removeSubfolders(vector<string>& folder) {
sort(begin(folder), end(folder));
vector<string> answer;
string curr = folder[0];
answer.push_back(curr);
for (auto s : folder | views::drop(1)) {
if (string_view(s).starts_with(curr + "/")) {
continue;
}
curr = s;
answer.push_back(s);
}
return answer;
}
};
int main() {
Solution *sol = new Solution();
map<vector<string>, vector<string> > cases = {
{{"/a", "/a/b", "/c/d", "/c/d/e", "/c/f"}, {"/a", "/c/d", "/c/f"}},
{{"/a", "/a/b/c", "/a/b/d"}, {"/a"}},
{{"/a/b/c", "/a/b/ca", "/a/b/d"}, {"/a/b/c", "/a/b/ca", "/a/b/d"}},
};
int test = 1;
for (pair<vector<string>, vector<string> > c : cases) {
auto got = sol->removeSubfolders(c.first);
assert(
(got == c.second && printf("Test %d: OK\n", test))
|| printf("Test %d: WA\n", test)
);
test++;
}
return EXIT_SUCCESS;
}