请你设计一个迭代器类,包括以下内容:
- 一个构造函数,输入参数包括:一个 有序且字符唯一 的字符串
characters
(该字符串只包含小写英文字母)和一个数字combinationLength
。 - 函数 next() ,按 字典序 返回长度为
combinationLength
的下一个字母组合。 - 函数 hasNext() ,只有存在长度为
combinationLength
的下一个字母组合时,才返回True
;否则,返回False
。
示例:
CombinationIterator iterator = new CombinationIterator("abc", 2); // 创建迭代器 iterator iterator.next(); // 返回 "ab" iterator.hasNext(); // 返回 true iterator.next(); // 返回 "ac" iterator.hasNext(); // 返回 true iterator.next(); // 返回 "bc" iterator.hasNext(); // 返回 false
提示:
1 <= combinationLength <= characters.length <= 15
- 每组测试数据最多包含
10^4
次函数调用。 - 题目保证每次调用函数
next
时都存在下一个字母组合。
考试时未完成,找了榜单上一个大佬代码学习一下
class CombinationIterator {
public:
int cur;
vector<string> v;
string t;
int n;
void dfs(int p, string cur) {
if(cur.size() == n) {
v.push_back(cur);
return;
}
if(p == t.size()) return;
dfs(p+1, cur);
cur += t[p];
dfs(p+1, cur);
}
CombinationIterator(string s, int nn) {
t = s;n = nn;
dfs(0,"");
sort(v.begin(),v.end());
cur = 0;
}
string next() {
cur++;
return v[cur-1];
}
bool hasNext() {
return cur < v.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();
*/