1286. Iterator for Combination

Posted wentiliangkaihua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1286. Iterator for Combination相关的知识,希望对你有一定的参考价值。

Design an Iterator class, which has:

  • A constructor that takes a string characters of sorted distinct lowercase English letters and a number combinationLength as arguments.
  • A function next() that returns the next combination of length combinationLength in lexicographical order.
  • A function hasNext() that returns True if and only if there exists a next combination.

 

Example:

CombinationIterator iterator = new CombinationIterator("abc", 2); // creates the iterator.

iterator.next(); // returns "ab"
iterator.hasNext(); // returns true
iterator.next(); // returns "ac"
iterator.hasNext(); // returns true
iterator.next(); // returns "bc"
iterator.hasNext(); // returns false

 

Constraints:

  • 1 <= combinationLength <= characters.length <= 15
  • There will be at most 10^4 function calls per test.
  • It‘s guaranteed that all calls of the function next are valid.
class CombinationIterator {

PriorityQueue<String> pq = new PriorityQueue<>();
    public CombinationIterator(String s, int k) {
        generateSub(s,k,0,new StringBuilder());
    }
    private void generateSub(String s ,int len,int start,StringBuilder result) {
        if (len == 0){
            pq.add(result.toString());
            return;
        }
        for (int i = start; i <= s.length()-len; i++){
            result.append(s.charAt(i));
            generateSub(s, len-1, i+1, result);
            result.deleteCharAt(result.length()-1);
        }
    }
    public String next() {
        return pq.poll();
    }
    public boolean hasNext() {
        return !pq.isEmpty();
    }
}
class CombinationIterator {

    Queue<String> qu = new LinkedList();
    String orig = "";
    public CombinationIterator(String characters, int combinationLength) {
        orig = characters;
        find("", 0, combinationLength);
    }
    
    void find(String str, int index, int len) {
        if(len ==0) {
            qu.add(str);
            return;
        }
        for(int i= index; i<orig.length(); i++) {
            char ch = orig.charAt(i);
            find(str+ch , i+1, len-1);
        }
        
    }
    
    public String next() {
        if(!qu.isEmpty()) {
            return qu.poll();
        }
        return "";
    }
    
    public boolean hasNext() {
        return !qu.isEmpty();
    }
}

以上是关于1286. Iterator for Combination的主要内容,如果未能解决你的问题,请参考以下文章

ES6(Iterator 和 for...of 循环)

for()与iterator()遍历循环的区别,各自的特点?

2018.03.27 pandas concat 和 combin_first使用

ES6学习之Iterator和For...of循环

es6-15 Iterator 和 for of 循环

List遍历:for,foreach还是Iterator?