मान लीजिए कि हमारे पास एक स्ट्रिंग 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