题目描述: 请你设计一个迭代器类,包括以下内容:
一个构造函数,输入参数包括:一个 有序且字符唯一 的字符串 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
思路: 首先递归求出所有的可能,然后再填充迭代器的内容
代码如下:
class CombinationIterator { public: vector<string>combination; int tag=0; CombinationIterator(string characters, int combinationLength) { dfs(characters,combinationLength,0,""); } void dfs(string s,int len,int idx,string cur){ if(cur.size()==len){ combination.push_back(cur); return; } for(int i=idx;i<s.size();i++){ dfs(s,len,i+1,cur+s[i]); } } string next() { return combination[tag++]; } bool hasNext() { return tag<combination.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(); */