मान लीजिए हमारे पास फोल्डरों की एक सूची है, हमें उन फोल्डरों में सभी सब-फोल्डरों को हटाना है और किसी भी क्रम में हटाने के बाद के फोल्डरों को वापस करना है। यदि कोई folder[i] किसी अन्य folder[j] के भीतर स्थित है, तो इसे उसका सबफोल्डर माना जाता है। पथ folder1/subfolder2/... जैसे होंगे।
उदाहरण के लिए, इनपुट ["/myfolder","/myfolder/secondfolder","/another/document","/another/document/extrafolder","/another/final"] है, तो आउटपुट ["/myfolder","/another/final","/another/document"] होगा।
हल करने के चरण
- पथों की लंबाई के आधार पर फोल्डर सरणी को सॉर्ट करें
- एक मैप m और एक सरणी ans बनाएं
- i को 0 से पथ सरणी के आकार - 1 तक लूप करें
- s := path_array[i]
- temp := खाली स्ट्रिंग
- flag को true सेट करें
- j को 0 से s के आकार तक लूप करें
- temp := temp + s[j]
- j को 1 से बढ़ाएं
- जब तक j < सरणी का आकार और s[j] '/' नहीं है
- temp := temp + s[j], j को 1 से बढ़ाएं
- यदि m[temp] false नहीं है, तो flag := false, और ब्रेक करें
- यदि flag true है, तो s को ans में डालें, और m[s] := true सेट करें
- ans वापस करें
उदाहरण
#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, ]