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;
}

slackmart space © 2025