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

सी ++ में एक सबस्ट्रिंग की घटनाओं की अधिकतम संख्या


मान लीजिए कि हमारे पास एक स्ट्रिंग s है, हमें निम्नलिखित नियमों को पूरा करने वाले किसी भी सबस्ट्रिंग की अधिकतम संख्या का पता लगाना है -

  • सबस्ट्रिंग में अलग-अलग वर्णों की संख्या मैक्सलेटर्स से कम या उसके बराबर होनी चाहिए।
  • सबस्ट्रिंग का आकार minSize और maxSize सहित रेंज में होना चाहिए।

तो अगर इनपुट इस तरह है - "आबाबकाब", मैक्सलेटर्स =2, मिनसाइज =3 और मैक्ससाइज =4, तो आउटपुट 2 होगा। सबस्ट्रिंग "आब" में मूल स्ट्रिंग में 2 घटनाएं होती हैं। यह शर्तों को पूरा करता है, 2 अद्वितीय अक्षर और आकार 3 (minSize और maxSize के बीच)।

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

  • नक्शा परिभाषित करें मी
  • sz के लिए minSize से maxSize तक
    • नक्शा x बनाएं, एक अस्थायी बनाएं, प्रारंभ में खाली
    • मैं के लिए 0 से sz - 1 की सीमा में
      • x[s[i]] को 1 से बढ़ाएं
      • अस्थायी:=अस्थायी + एस[i]
    • के लिए j 0 है, i श्रेणी sz से s-1 के आकार तक, i और j को 1 से बढ़ाएँ
      • यदि x <=maxLetters का आकार है, तो m[temp] को 1 से बढ़ा दें
      • x[temp[0]] 1 से घटाएं
      • यदि x[temp[0]] 0 है, तो x से temp[0] हटा दें
      • अस्थायी के पहले और दूसरे तत्व को अस्थायी से ही हटाएं
      • x[s[i]] को 1 से बढ़ाएं
      • अस्थायी:=अस्थायी + एस[i]
    • यदि x <=maxLetters का आकार है, तो m[temp] को 1 से बढ़ा दें
  • उत्तर:=0
  • जबकि मानचित्र m में कुछ तत्व हैं, तब
    • उत्तर :=अधिकतम उत्तर और ith कुंजी-मान युग्म का मान
  • वापसी उत्तर

उदाहरण(C++)

आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int maxFreq(string s, int maxLetters, int minSize, int maxSize) {
      unordered_map <string ,int > m;
      for(int sz = minSize; sz <= minSize; sz++){
         unordered_map <char, int> x;
         string temp ="";
         for(int i = 0; i < sz; i++){
            x[s[i]]++;
            temp += s[i];
         }
         for(int j = 0, i = sz; i < s.size(); i++, j++){
            if(x.size() <= maxLetters){
               m[temp]++;
            }
            x[temp[0]]--;
            if(x[temp[0]] == 0)x.erase(temp[0]);
            temp.erase(temp.begin(),temp.begin() + 1);
            x[s[i]]++;
            temp += s[i];
         }
         if(x.size() <= maxLetters){
            m[temp]++;
         }
      }
      int ans = 0;
      unordered_map <string ,int > :: iterator i = m.begin();
      while(i != m.end()){
         ans = max (ans, i->second);
         i++;
      }
      return ans;
   }
};
main(){
   Solution ob;
   cout << (ob.maxFreq("aababcaab",2,3,4));
}

इनपुट

"aababcaab"
2
3
4

आउटपुट

2

  1. C++ में मितव्ययी संख्या

    इस समस्या में, हमें एक धनात्मक पूर्णांक N दिया जाता है। हमारा कार्य यह जाँचने के लिए एक प्रोग्राम बनाना है कि दी गई संख्या मितव्ययी संख्या है या नहीं। मितव्ययी संख्या - एक संख्या जिसके अंकों की संख्या दी गई संख्या के अभाज्य गुणनखंड में अंकों की संख्या से अधिक है। उदाहरण − 625, संख्या 625 का अभाज्

  1. सी++ पेंटाटोप नंबर

    पास्कल के त्रिभुज में एक पंचकोण संख्या को पाँचवीं संख्या के रूप में वर्णित किया गया है। अब, जैसा कि आप जानते हैं, यह पांचवीं संख्या है, तो इसका मतलब है कि हमारे पास पास्कल के त्रिकोण में कम से कम पांच संख्याएं होनी चाहिए, इसलिए इस श्रृंखला की पहली संख्या 1 4 6 4 1 से शुरू होती है। पास्कल त्रिभुज की

  1. सी ++ पथ लंबाई जिसमें अधिकतम संख्या में मोड़ हैं

    एक समस्या को हल करने के लिए जिसमें हमें एक बाइनरी ट्री दिया जाता है। अब हमें उस पथ को खोजने की आवश्यकता है जिसमें अधिकतम संख्या में मोड़ हों। यानी, एक मोड़ तब माना जाता है जब पथ की दिशा बाएं से दाएं या इसके विपरीत बदलती है, उदाहरण के लिए इनपुट - आउटपुट - 6 अब इस दृष्टिकोण में, हम पेड़ से गुजरें