LeetCode-1286. 字母组合迭代器

请你设计一个迭代器类,包括以下内容:

一个构造函数,输入参数包括:一个 有序且字符唯一 的字符串 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;
}
发布了245 篇原创文章 · 获赞 57 · 访问量 36万+

猜你喜欢

转载自blog.csdn.net/qq_16542775/article/details/103793309