Design an Iterator class, which has:
- A constructor that takes a string
characters
of sorted distinct lowercase English letters and a numbercombinationLength
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(); } }