技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

leetCode:1286. Iterator for Combination

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;
        }
    }
}