เราต้องออกแบบคลาส Iterator ที่มีการดำเนินการดังนี้:
- คอนสตรัคเตอร์รับสตริง
characters(ตัวอักษรภาษาอังกฤษพิมพ์เล็กเรียงลำดับไม่ซ้ำ) และตัวเลขcombinationLength - ฟังก์ชัน
next()คืนการจัดหมู่ (combination) ถัดไปที่มีความยาวcombinationLengthตามลำดับอักษร - ฟังก์ชัน
hasNext()คืนtrueก็ต่อเมื่อมีการจัดหมู่ถัดไป
ตัวอย่าง: CombinationIterator iterator = new CombinationIterator("xyz", 2);
iterator.next() คืน "xy"
iterator.hasNext() คืน true
iterator.next() คืน "xz"
iterator.hasNext() คืน true
iterator.next() คืน "yz"
iterator.hasNext() คืน false
ขั้นตอนการแก้ปัญหา (Pre-compute All Combinations)
- สร้างอาร์เรย์
combsของสตริง และดัชนีidx - กำหนดเมธอด
makeCombs(s, l, temp="", start=0):- ถ้าขนาดของ
temp == lใส่tempเข้าcombsคืนค่า - วนลูป
iจากstartถึงขนาดของ s:- เรียก
makeCombs(s, l, temp + s[i], i + 1)
- เรียก
- ถ้าขนาดของ
- คอนสตรัคเตอร์: เรียก
makeCombs(c, cl)กำหนดidx := 0 next(): เพิ่มidxคืนcombs[idx - 1]hasNext(): คืนtrueถ้าidx != ขนาดของ combsมิฉะนั้น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());
}
};
int 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