Design an Iterator class, which has:
- A constructor that takes a string
characters
of sorted distinct lowercase English letters and a numbercombinationLength
as arguments. - A function next() that returns the next combination of length
combinationLength
in lexicographical order. - A function hasNext() that returns
True
if and only if there exists a next combination.
Example:
CombinationIterator iterator = new CombinationIterator("abc", 2); // creates the iterator.
iterator.next(); // returns "ab"
iterator.hasNext(); // returns true
iterator.next(); // returns "ac"
iterator.hasNext(); // returns true
iterator.next(); // returns "bc"
iterator.hasNext(); // returns false
Constraints:
1 <= combinationLength <= characters.length <= 15
- There will be at most
10^4
function calls per test. - It's guaranteed that all calls of the function
next
are valid.
题解:
class CombinationIterator {
private:
vector<string> dic;
int idx = 0;
void buildIterator(int begin, string &cur, int combinationLength, string &characters) {
if (cur.length() == combinationLength) {
dic.push_back(cur);
return;
}
for (int i = begin + 1; i < characters.length(); i++) {
cur += characters[i];
buildIterator(i, cur, combinationLength, characters);
cur.pop_back();
}
}
public:
CombinationIterator(string characters, int combinationLength) {
for (int i = 0; i < characters.size(); i++) {
string cur;
cur += characters[i];
buildIterator(i, cur, combinationLength, characters);
}
}
string next() {
return dic[idx++];
}
bool hasNext() {
return idx < dic.size();
}
};
/**
* Your CombinationIterator object will be instantiated and called as such:
* CombinationIterator* obj = new CombinationIterator(characters, combinationLength);
* string param_1 = obj->next();
* bool param_2 = obj->hasNext();
*/