请你设计一个迭代器类,包括以下内容:
一个构造函数,输入参数包括:一个 有序且字符唯一 的字符串 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 时都存在下一个字母组合。
理解组合数
#include <iostream>
#include <queue>
using namespace std;
class CombinationIterator {
public:
CombinationIterator(string characters, int combinationLength) {
dfs(characters, combinationLength, 0, "");
}
string next() {
string front = m_queue.front();
m_queue.pop();
return front;
}
bool hasNext() {
return (!m_queue.empty());
}
private:
int length;
queue<string> m_queue;
void dfs(string str, int len, int index, string dest){
if(dest.size()==len){
m_queue.push(dest);
return;
}
for(int i=index;i<str.size();i++){
dfs(str,len,i+1,dest+str[i]);
}
}
};
int main(){
CombinationIterator *iterator = new CombinationIterator("abc", 2);
cout<<iterator->next()<<endl; // 返回 "ab"
cout<<iterator->hasNext()<<endl; // 返回 true
cout<< iterator->next()<<endl; // 返回 "ac"
cout<<iterator->hasNext()<<endl; // 返回 true
cout<<iterator->next()<<endl; // 返回 "bc"
cout<< iterator->hasNext()<<endl; // 返回 false
return 0;
}