কম্পিউটার

C++ এ কম্বিনেশনের জন্য ইটারেটর


ধরুন আমাদের একটি ইটারেটর ক্লাস ডিজাইন করতে হবে, যেটিতে কয়েকটি অপারেশন রয়েছে -

  • একটি কনস্ট্রাক্টরকে সংজ্ঞায়িত করুন যা সাজানো স্বতন্ত্র ছোট হাতের ইংরেজি অক্ষরগুলির একটি স্ট্রিং অক্ষর এবং প্যারামিটার হিসাবে একটি সংখ্যা সমন্বয় দৈর্ঘ্য নেয়৷
  • একটি ফাংশন পরবর্তী() সংজ্ঞায়িত করুন যা বর্ণানুক্রমিক দৈর্ঘ্যের সংমিশ্রণ দৈর্ঘ্যের পরবর্তী সমন্বয় প্রদান করে।
  • আরেকটি ফাংশন 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। এটি নিম্নরূপ সংজ্ঞায়িত করা হয়েছে -
  • যদি temp =l এর আকার হয়, তাহলে চিরুনিতে টেম্প প্রবেশ করান এবং রিটার্ন করুন
  • আমি পরিসীমার জন্য s
      এর আকার শুরু করি
    • makeCombs(s, l, temp + s[i], i + 1)
  • printVector() পদ্ধতিটি স্ট্রিং এর অ্যারেকে ইনপুট হিসাবে গ্রহণ করবে, এটি সেই অ্যারের উপাদানগুলি প্রদর্শন করবে
  • নিম্নলিখিতভাবে কন্সট্রাক্টরকে সংজ্ঞায়িত করুন:এটি c এবং cl স্ট্রিং নেবে,
  • কল makeCombs(c, cl), সেট idx :=0
  • পরবর্তী() পদ্ধতিটি idx বাড়াবে এবং কম্ব [idx - 1] ফেরত দেবে
  • hasNext() পদ্ধতিটি সত্য হবে যদি 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

  1. C++ এ বাইনারি সার্চ ট্রি ইটারেটার

  2. স্ট্রিং ম্যাচিংয়ের জন্য বিটাপ অ্যালগরিদম বাস্তবায়নের জন্য C++ প্রোগ্রাম

  3. C++ এ একটি স্ট্রিং টোকেনাইজ করা

  4. C++ এ একটি স্ট্রিংকে টোকেনাইজ করবেন?