Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> 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[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

  • वापसी उत्तर

उदाहरण(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++ में सभी डुप्लीकेट सबट्री खोजें

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

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

    एक स्ट्रिंग में सभी सबस्ट्रिंग को खोजने के लिए C# में सबस्ट्रिंग () विधि का उपयोग करें। मान लें कि हमारा स्ट्रिंग है - Xyz स्ट्रिंग की लंबाई के माध्यम से लूप करें और स्ट्रिंग के शुरुआत से अंत तक सबस्ट्रिंग फ़ंक्शन का उपयोग करें - for (int start = 0; start <= str.Length - i; start++) {   &nbs

  1. पायथन में टी में एक स्ट्रिंग एस के सभी विपर्यय के प्रारंभ सूचकांकों को खोजने के लिए कार्यक्रम

    मान लीजिए कि हमारे पास दो तार S और T हैं, हमें T में S के विपर्यय के सभी प्रारंभिक सूचकांकों को खोजना है। स्ट्रिंग्स में केवल लोअरकेस अक्षर होते हैं और दोनों स्ट्रिंग्स S और T की लंबाई 20 और 100 से बड़ी नहीं होगी। इसलिए, यदि इनपुट S =cab T =bcabxabc जैसा है, तो आउटपुट bca, cab और abc सबस्ट्रिंग के