leetCodeの「1286. Iterator for Combination」を解いた。
https://leetcode.com/problems/iterator-for-combination/
Iteratorの作り方など、いろいろ参考になることが多い問題だったので、コメント付きの解答をここに残しておく。
import java.util.ArrayList; import java.util.List; class CombinationIterator { // Iterate 対象の単語集 private List<String> words = new ArrayList<>(); // 単語集のうち、Iterate が何処まで進んだのかを示す private int pos = 0; // 単語集を構成する文字達 private String characters; // 単語集の各単語の長さ private int combinationLength; public CombinationIterator(String characters, int combinationLength) { this.characters = characters; this.combinationLength = combinationLength; buildWords("", 0); } // 事前に単語集を作成する。 // 再帰処理を使っている。引数については、soFar の状態で、startPos に入ってくるという前提 private void buildWords(String soFar, int startPos) { // 終了条件 if (soFar.length() >= combinationLength) { words.add(soFar); return; } for (int i = startPos; i < characters.length(); i++) { String cur = soFar + characters.charAt(i); buildWords(cur, i + 1); } } public String next() { return words.get(pos++); } public boolean hasNext() { if (pos > words.size() - 1) { return false; } else { return true; } } }