Computer >> Máy Tính >  >> Lập trình >> C ++

Xóa các thư mục con khỏi hệ thống tệp trong C ++

Giả sử chúng ta có một danh sách các thư mục, chúng ta phải xóa tất cả các thư mục con trong các thư mục đó và trả lại các thư mục theo thứ tự bất kỳ sau khi xóa. Ở đây nếu một thư mục [i] nằm trong một thư mục [j] khác, thì nó được biểu thị là thư mục con của nó. Các đường dẫn sẽ giống như folder1 / subfolder2 /… vv

Giả sử đầu vào giống như

["/myfolder","/myfolder/secondfolder","/another/document","/another/document/extrafolder","/another/final"], then the output will be:
["/myfolder","/another/final","/another/document"]

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • sắp xếp mảng thư mục dựa trên độ dài của các đường dẫn
  • tạo một bản đồ m và một mảng khác
  • cho tôi trong phạm vi từ 0 đến kích thước của mảng đường dẫn - 1
    • s:=path_array [i]
    • temp:=chuỗi trống
    • đặt cờ là true
    • cho j trong phạm vi 0 đến kích thước của s
      • temp:=temp + s [j]
      • tăng j lên 1
      • while j
      • temp:=temp + s [j] và tăng j lên 1
    • nếu m [temp] không sai, thì flag:=false và break
  • nếu cờ là true, thì hãy chèn s vào ans và đặt m [s]:=true
  • trả lại ans
  • Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

    Ví dụ

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<auto> v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << v[i] << ", ";
       }
       cout << "]"<<endl;
    }
    class Solution {
       public:
       static bool cmp(string s,string x){
          return s.size()<x.size();
       }
       vector<string> removeSubfolders(vector<string>& f) {
          sort(f.begin(),f.end(),cmp);
          map <string,bool> m;
          vector <string> ans;
          for(int i =0;i<f.size();i++){
             string s= f[i];
             string temp="";
             bool flag = true;
             for(int j =0;j<s.size();){
                temp+=s[j];
                j++;
                while(j<s.size() && s[j]!='/'){
                   temp+=s[j];
                   j++;
                }
                if(m[temp]){
                   flag = false;
                   break;
                }
             }
             if(flag){
                ans.push_back(s);
                m[s]=true;
             }
          }
          return ans;
       }
    };
    main(){
       vector<string> v = {"/myfolder","/myfolder/secondfolder","/another/document","/another/document/extrafolder","/another/final"};
       Solution ob;
       print_vector(ob.removeSubfolders(v));
    }

    Đầu vào

    ["/myfolder","/myfolder/secondfolder","/another/document","/another/document/extrafolder","/another/final"]

    Đầu ra

    [/myfolder, /another/final, /another/document, ]