Design the CombinationIterator class:
CombinationIterator(string characters, int combinationLength)Initializes the object with a stringcharactersof sorted distinct lowercase English letters and a numbercombinationLengthas arguments.next()Returns the next combination of lengthcombinationLengthin lexicographical order.hasNext()Returnstrueif and only if there exists a next combination.
Example 1:
Input
["CombinationIterator", "next", "hasNext", "next", "hasNext", "next", "hasNext"]
[["abc", 2], [], [], [], [], [], []]
Output
[null, "ab", true, "ac", true, "bc", false]
Explanation
CombinationIterator itr = new CombinationIterator("abc", 2);
itr.next(); // return "ab"
itr.hasNext(); // return True
itr.next(); // return "ac"
itr.hasNext(); // return True
itr.next(); // return "bc"
itr.hasNext(); // return False
Constraints:
1 <= combinationLength <= characters.length <= 15- All the characters of
charactersare unique. - At most
104calls will be made tonextandhasNext. - It's guaranteed that all calls of the function
nextare valid.
Related Topics:
String, Backtracking, Design, Iterator
// OJ: https://leetcode.com/problems/iterator-for-combination/
// Author: github.com/lzl124631x
// Time:
// CombinationIterator: O(S)
// next: O(L)
// hasNext: O(1)
// Space: O(S)
class CombinationIterator {
string s;
vector<int> index;
public:
CombinationIterator(string s, int len) : s(s), index(len) {
iota(begin(index), end(index), 0);
}
string next() {
string ans;
for (int n : index) ans += s[n];
int i = index.size() - 1; // find the first from right index that should be incremented.
while (i > 0 && index[i] == s.size() - index.size() + i) --i;
++index[i++];
for (; i < index.size(); ++i) index[i] = index[i - 1] + 1;
return ans;
}
bool hasNext() {
return index[0] <= s.size() - index.size();
}
};