मान लीजिए हमारे पास दो स्ट्रिंग्स S और T हैं, हमें T में S के सभी एनाग्राम्स के शुरुआती इंडेक्स ढूंढने हैं। स्ट्रिंग्स में केवल लोअरकेस अक्षर होते हैं और दोनों स्ट्रिंग्स S और T की लंबाई 20 और 100 से अधिक नहीं होगी।
तो, अगर इनपुट है S = "cab" T = "bcabxabc", तो आउटपुट [0, 1, 5] होगा, क्योंकि सबस्ट्रिंग्स "bca", "cab" और "abc" हैं।
एल्गोरिदम
- एक मैप m परिभाषित करें, n := s का आकार, left := 0, right := 0, counter := p का आकार सेट करें
- एक ऐरे ans परिभाषित करें
- p में कैरेक्टर्स की फ्रीक्वेंसी को मैप m में स्टोर करें
- right := 0 से n-1 तक
- अगर m में s[right] है और m[s[right]] नॉन-जीरो है, तो m[s[right]] को 1 से घटाएं, counter को 1 से घटाएं और अगर counter = 0 है, तो left को ans में डालें
- अन्यथा
- जब तक left < right
- अगर s[left] m में मौजूद नहीं है, तो counter को 1 बढ़ाएं, और m[s[left]] को 1 बढ़ाएं
- left को 1 बढ़ाएं
- अगर m में s[right] है और m[s[right]] नॉन-जीरो है, तो right को 1 घटाएं, और लूप से बाहर निकलें
- अगर m में s[left] नहीं है, तो left := right + 1 सेट करें
- जब तक left < right
- ans लौटाएं
इम्प्लीमेंटेशन (C++ में)
#include
using namespace std;
void print_vector(vector v){
cout << "[";
for(int i = 0; i findAnagrams(string s, string p) {
map m;
int n = s.size();
int left = 0, right = 0;
int counter = p.size();
vector 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
इनपुट
"bcabxabc", "cab"
आउटपुट
[0, 1, 5, ]