मान लीजिए हमें एक इटरेटर क्लास डिज़ाइन करनी है, जिसमें कुछ ऑपरेशन्स हों -
- एक कंस्ट्रक्टर परिभाषित करें जो सॉर्टेड डिस्टिंक्ट लोअरकेस इंग्लिश लेटर्स की एक स्ट्रिंग characters और एक नंबर combinationLength को पैरामीटर के रूप में लेता है।
- next() नामक एक फंक्शन परिभाषित करें जो अल्फाबेटिक क्रम में combinationLength लंबाई का अगला कॉम्बिनेशन लौटाता है।
- hasNext() नामक एक और फंक्शन परिभाषित करें जो तभी True लौटाता है जब अगला कॉम्बिनेशन मौजूद हो।
यदि इनपुट इस प्रकार है -
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इसे हल करने के लिए, हम निम्नलिखित चरणों का पालन करेंगे -
- स्ट्रिंग्स का एक ऐरे comb और इंडेक्स idx बनाएं
- makeCombs() नामक एक मेथड परिभाषित करें, जो स्ट्रिंग s, इंटीजर वेरिएबल l, एक टेम्प स्ट्रिंग लेगा, जो प्रारंभ में खाली है, और स्टार्ट, जो प्रारंभ में 0 है। यह इस प्रकार परिभाषित है -
- यदि temp का आकार = l है, तो temp को comb में डालें और लौटें
- i के लिए स्टार्ट से s के आकार तक की रेंज में
- makeCombs(s, l, temp + s[i], i + 1)
- printVector() मेथड स्ट्रिंग्स के ऐरे को इनपुट के रूप में लेगा, यह उस ऐरे के एलिमेंट्स को डिस्प्ले करेगा
- कंस्ट्रक्टर को इस प्रकार परिभाषित करें: यह स्ट्रिंग c और cl लेगा,
- makeCombs(c, cl) कॉल करें, idx := 0 सेट करें
- next() मेथड idx को बढ़ाएगा और comb[idx - 1] लौटाएगा
- hasNext() मेथड true लौटाएगा यदि idx comb के आकार के समान नहीं है, अन्यथा false।
उदाहरण (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; }इनपुट
"xyz" और 2 से इनिशियलाइज़ करें, फिर next() और hasNext() को कई बार कॉल करें
आउटपुट
xy 1 xz 1 yz 0