मान लीजिए हमारे पास फ़ोल्डरों की एक सूची है, हमें उन फ़ोल्डरों में सभी उप-फ़ोल्डरों को हटाना होगा और किसी भी क्रम में फ़ोल्डरों को हटाने के बाद वापस करना होगा। यहां यदि कोई फ़ोल्डर [i] किसी अन्य फ़ोल्डर [j] के भीतर स्थित है, तो इसे इसके सबफ़ोल्डर के रूप में दर्शाया जाता है। पथ फ़ोल्डर1/सबफ़ोल्डर2/… आदि जैसे होंगे।
मान लीजिए इनपुट की तरह है
["/myfolder","/myfolder/secondfolder","/another/document","/another/document/extrafolder","/another/final"], then the output will be: ["/myfolder","/another/final","/another/document"]
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- पथों की लंबाई के आधार पर फ़ोल्डर सरणी को क्रमबद्ध करें
- एक नक्शा m बनाएं, और दूसरा सरणी उत्तर दें
- मैं के लिए 0 से पथ सरणी के आकार में - 1
- s :=path_array[i]
- अस्थायी:=खाली स्ट्रिंग
- झंडे को सही के रूप में सेट करें
- जे के लिए 0 से लेकर एस के आकार तक
- अस्थायी:=अस्थायी + एस[जे]
- j को 1 से बढ़ाएं
- जबकि j <सरणी का आकार और s[j] '/' नहीं है
- अस्थायी:=अस्थायी + s[j], और j को 1 से बढ़ाएं
- अगर m[temp] गलत नहीं है, तो फ्लैग करें:=असत्य, और तोड़ें
- यदि ध्वज सत्य है, तो उत्तर में s डालें और m[s] :=true सेट करें
- वापसी उत्तर
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#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));
} इनपुट
["/myfolder","/myfolder/secondfolder","/another/document","/another/document/extrafolder","/another/final"]
आउटपुट
[/myfolder, /another/final, /another/document, ]