मान लीजिए कि हमें एक Iterator वर्ग डिज़ाइन करना है, जिसमें कुछ ऑपरेशन शामिल हैं -
- एक ऐसे कंस्ट्रक्टर को परिभाषित करें जो सॉर्ट किए गए अलग-अलग लोअरकेस अंग्रेज़ी अक्षरों के स्ट्रिंग वर्ण और पैरामीटर के रूप में एक संख्या संयोजनLength लेता है।
- अगले फ़ंक्शन को परिभाषित करें() जो लंबाई संयोजन के अगले संयोजन को वर्णानुक्रम में लंबाई देता है।
- किसी अन्य फ़ंक्शन को परिभाषित करें hasNext() जो कि सही है और केवल तभी लौटाता है जब कोई अगला संयोजन मौजूद हो।
तो अगर इनपुट की तरह है -
CombinationIterator iterator = new CombinationIterator("xyz", 2);
iterator.next(); // returns "xy"
iterator.hasNext(); // returns true
iterator.next(); // returns "xz"
iterator.hasNext(); // returns true
iterator.next(); // returns "yz"
iterator.hasNext(); // returns false इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- स्ट्रिंग्स और इंडेक्स आईडीएक्स की एक सरणी कंघी बनाएं
- एक विधि को परिभाषित करें makeCombs(), यह स्ट्रिंग s, पूर्णांक चर l, एक अस्थायी स्ट्रिंग लेगा, जो प्रारंभ में खाली है, और प्रारंभ है, जो प्रारंभ में 0 है। इसे निम्नानुसार परिभाषित किया गया है -
- यदि अस्थायी का आकार =l है, तो अस्थायी को कंघी में डालें और वापस लौटें
- के लिए मैं रेंज में एस के आकार के शुरू करने के लिए
- makeCombs(s, l, temp + s[i], i + 1)
- printVector() विधि स्ट्रिंग की सरणी को इनपुट के रूप में लेगी, यह उस सरणी के तत्वों को प्रदर्शित करेगी
- कन्स्ट्रक्टर को इस प्रकार परिभाषित करें:यह स्ट्रिंग c और cl लेगा,
- मेककॉम्स को कॉल करें (सी, सीएल), आईडीएक्स सेट करें:=0
- अगली() विधि idx को बढ़ाएगी और कंघी वापस करेगी[idx - 1] यदि idx कंघी के आकार के समान नहीं है, अन्यथा गलत है, तो
- हैनेक्स्ट () विधि सही हो जाएगी।
उदाहरण(C++)
एक बेहतर समझ प्राप्त करने के लिए आइए निम्नलिखित कार्यान्वयन को देखें -
#include <bits/stdc++.h>
using namespace std;
class CombinationIterator {
public:
vector <string> combs;
int idx;
void makeCombs(string s, int l, string temp ="", int start = 0){
if(temp.size() == l){
combs.push_back(temp);
return;
}
for(int i = start; i < s.size(); i++){
makeCombs(s, l, temp + s[i], i + 1);
}
}
void printVector(vector <string> v){
for(int i = 0; i < v.size(); i++){
cout << v[i] << "\n";
}
cout << endl;
}
CombinationIterator(string c, int cl) {
makeCombs(c, cl);
idx = 0;
}
string next() {
idx++;
return combs[idx - 1];
}
bool hasNext() {
return !(idx == combs.size());
}
};
main(){
CombinationIterator ob("xyz", 2);
cout << (ob.next()) << endl;
cout << (ob.hasNext()) << endl;
cout << (ob.next()) << endl;
cout << (ob.hasNext()) << endl;
cout << (ob.next()) << endl;
cout << (ob.hasNext()) << endl;
} इनपुट
Initialize with “xyz” and 2, then call next() and hasNext() multiple times
आउटपुट
xy 1 xz 1 yz 0