Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में स्ट्रिंग में सभी एनाग्राम ढूंढें


मान लीजिए हमारे पास एक स्ट्रिंग s और एक नॉन-खाली स्ट्रिंग p है, हमें s में p के सभी एनाग्राम के स्टार्ट इंडेक्स ढूंढने हैं। स्ट्रिंग्स में केवल लोअरकेस लेटर्स होते हैं और दोनों स्ट्रिंग्स s और p की लंबाई 20 और 100 से अधिक नहीं होगी। उदाहरण के लिए, यदि s: "cbaebabacd" p: "abc", तो आउटपुट [0, 6] होगा, इंडेक्स 0 पर, यह "cba" है, और दूसरा "bac" है, ये "abc" के एनाग्राम हैं।

इसे हल करने के लिए, हम निम्नलिखित चरणों का पालन करेंगे -

  • एक मैप m परिभाषित करें, n := s का आकार, लेफ्ट := 0, राइट := 0, काउंटर := p का आकार सेट करें
  • ans नामक एक ऐरे परिभाषित करें
  • p में कैरेक्टर्स की फ्रीक्वेंसी को मैप m में स्टोर करें
  • राइट := 0 से n - 1 तक
    • यदि m में s[राइट] है और m[s[राइट]] नॉन-जीरो है, तो m[s[राइट]] को 1 से घटाएं, काउंटर को 1 से घटाएं और यदि काउंटर = 0 है, तो लेफ्ट को ans में डालें
    • अन्यथा
      • जब तक लेफ्ट < राइट,
        • यदि s[लेफ्ट] m में मौजूद नहीं है, तो काउंटर को 1 से बढ़ाएं, और m[s[लेफ्ट]] को 1 से बढ़ाएं
        • लेफ्ट को 1 से बढ़ाएं
        • यदि m में s[राइट] है और m[s[राइट]] नॉन-जीरो है, तो राइट को 1 से घटाएं, और लूप से बाहर आएं
      • यदि m में s[लेफ्ट] नहीं है, तो लेफ्ट := राइट + 1 सेट करें
  • ans लौटाएं

उदाहरण (C++)

बेहतर समझ के लिए निम्नलिखित इम्प्लीमेंटेशन देखें -

#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("cbaebabacd", "abc")) ; }

इनपुट

"cbaebabacd" "abc"

आउटपुट

[0, 6, ]

  1. C++ में सभी डुप्लिकेट सबट्री खोजें C++ में सभी डुप्लिकेट सबट्री खोजें

    मान लीजिए हमारे पास एक बाइनरी ट्री है। हमें यह पता लगाना है कि ट्री में कुछ डुप्लिकेट सबट्री हैं या नहीं। मान लीजिए हमारे पास नीचे जैसा बाइनरी ट्री है: आकार 2 के दो समान सबट्री हैं। प्रत्येक सबट्री में D, BD और BE भी डुप्लिकेट सबट्री हैं। हम इस समस्या को ट्री सीरियलाइज़ेशन और हैशिंग प्रक्रिया का उ

  1. - C# में स्ट्रिंग के सभी सबस्ट्रिंग्स खोजना

    किसी स्ट्रिंग के सभी संभावित सबस्ट्रिंग्स खोजने के लिए हम नेस्टेड लूप्स का उपयोग करते हैं: बाहरी लूप सबस्ट्रिंग की लंबाई नियंत्रित करता है, आंतरिक लूप शुरुआती स्थिति। उदाहरण using System; class Demo { static void Main() { string str = xyz; // लंबाई 1 से str.Length-1 तक

  1. - पायथन में स्ट्रिंग S के सभी एनाग्राम्स के T में शुरुआती इंडेक्स ढूंढने का प्रोग्राम

    मान लीजिए हमारे पास दो स्ट्रिंग्स S और T हैं, हमें T में S के सभी एनाग्राम्स के शुरुआती इंडेक्स ढूंढने हैं। स्ट्रिंग्स में केवल लोअरकेस अक्षर होते हैं और दोनों स्ट्रिंग्स S और T की लंबाई 20 और 100 से अधिक नहीं होगी। तो, अगर इनपुट है S = cab T = bcabxabc, तो आउटपुट [0, 1, 5] होगा, क्योंकि सबस्ट्रिं