मान लीजिए कि हमारे पास दो तार S और T हैं, हमें T में S के विपर्यय के सभी प्रारंभिक सूचकांकों को खोजना है। स्ट्रिंग्स में केवल लोअरकेस अक्षर होते हैं और दोनों स्ट्रिंग्स S और T की लंबाई 20 और 100 से बड़ी नहीं होगी।पी>
इसलिए, यदि इनपुट S ="cab" T ="bcabxabc" जैसा है, तो आउटपुट "bca", "cab" और "abc" सबस्ट्रिंग के रूप में [0, 1, 5, ] होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे:
-
मानचित्र को परिभाषित करें m, n:=s का आकार, बाएँ सेट करें:=0, दाएँ:=0, काउंटर:=p का आकार
-
एक सरणी को परिभाषित करें ans
-
p में वर्णों की आवृत्ति को मानचित्र m में संग्रहीत करें
-
दाईं ओर :=0 से n - 1
-
यदि m में s[right] है और m[s[right]] शून्य नहीं है, तो m[s[right]] को 1 से घटाएं, काउंटर को 1 से घटाएं और यदि काउंटर =0 है, तो बाएं को उत्तर में डालें
-
अन्यथा
-
जबकि बाएं <दाएं,
-
यदि s[बाएं] m में मौजूद नहीं है, तो काउंटर को 1 से बढ़ाएं और m[s[बाएं]] को 1 से बढ़ाएं
-
बाईं ओर 1
. बढ़ाएं -
अगर m में s[right] है और m[s[right]] शून्य नहीं है, तो 1 से दाएं घटाएं और लूप से बाहर आएं
-
-
अगर m में कोई s[बाएं] नहीं है, तो बाएं सेट करें:=दायां + 1
-
-
-
वापसी उत्तर
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें:
उदाहरण
#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: vector<int> findAnagrams(string s, string p) { map <char, int> m; int n = s.size(); int left = 0, right = 0; int counter = p.size(); vector <int> ans; for(int i = 0; i < p.size(); i++) m[p[i]]++; for(int right = 0; right < n; right++){ if(m.find(s[right]) != m.end() && m[s[right]]){ m[s[right]]--; counter--; if(counter == 0)ans.push_back(left); } else { while(left<right){ if(m.find(s[left]) != m.end()) { counter++; m[s[left]]++; } left++; if(m.find(s[right]) != m.end() && m[s[right]]){ right--; break; } } if(m.find(s[left])==m.end())left = right + 1; } } return ans; } }; main(){ Solution ob; print_vector(ob.findAnagrams("bcabxabc", "cab")) ; }
इनपुट
"bcabxabc", "cab"
आउटपुट
[0, 1, 5, ]