Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ตัววนซ้ำสำหรับการรวมกันใน C++


สมมติว่าเราต้องออกแบบคลาส Iterator ซึ่งประกอบด้วยการดำเนินการไม่กี่อย่าง -

  • กำหนดคอนสตรัคเตอร์ที่ใช้อักขระสตริงของตัวอักษรภาษาอังกฤษตัวพิมพ์เล็กที่แตกต่างกันและชุดค่าผสมตัวเลขLength เป็นพารามิเตอร์
  • กำหนดฟังก์ชัน next() ที่คืนค่าชุดค่าผสมถัดไปของความยาวรวมกันLength ตามลำดับตัวอักษร
  • กำหนดฟังก์ชันอื่น 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

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • สร้างหวีอาร์เรย์ของสตริงและดัชนี idx
  • กำหนดเมธอด makeCombs() ซึ่งจะรับสตริง s ตัวแปรจำนวนเต็ม l สตริงชั่วคราว ที่ว่างในตอนแรก และเริ่มต้น ซึ่งเท่ากับ 0 เริ่มต้น ซึ่งกำหนดไว้ดังนี้ -
  • ถ้าขนาด temp =l ให้ใส่ temp เข้าไปในหวีแล้วคืนกลับ
  • สำหรับ i ในช่วงเริ่มต้นที่ขนาดของ s
    • makeCombs(s, l, temp + s[i], i + 1)
  • printVector() method จะนำอาร์เรย์ของ string เป็นอินพุต ซึ่งจะแสดงองค์ประกอบของอาร์เรย์นั้น
  • กำหนดคอนสตรัคเตอร์ดังนี้:สิ่งนี้จะใช้สตริง c และ cl
  • เรียก makeCombs(c, cl), set idx :=0
  • เมธอด next() จะเพิ่ม idx และส่งคืน comb[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