技術メモ

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

golang の map の使い方

golang で map を使って leetCode の典型的な問題を解いたので、今後の参考のために、書いたコードをここに残しておく。
重要そうなところは、ソース中のコメントに記載した。

type MagicDictionary struct {
    lengthToWords map[int][]string
}

func Constructor() MagicDictionary {
    return MagicDictionary{
        // 構造体を生成しただけでは中の map は生成されないので、ここで明示的に生成する。
        lengthToWords: map[int][]string{},
        // 以下でもOK。
        // lengthToWords: make(map[int][]string),
    }
}

func (this *MagicDictionary) BuildDict(dictionary []string) {
    for _, word := range dictionary {
        words := this.lengthToWords[len(word)]
        words = append(words, word)
        // append は新しい words を生成するので、生成後のものを map に戻す必要がある。
        this.lengthToWords[len(word)] = words
        // 上記の 3 行は、纏めて以下でもOK。
        // this.lengthToWords[len(word)] = append(this.lengthToWords[len(word)], word)
    }
}

func (this *MagicDictionary) Search(searchWord string) bool {
    // length に対応した word がなかった場合、words は空のスライスになるので nil チェック不要
    words := this.lengthToWords[len(searchWord)]
    for _, word := range words {
        if this.isMatched(searchWord, word) {
            return true
        }
    }
    return false
}

func (this *MagicDictionary) isMatched(searchWord string, dictWord string) bool {
    diffCnt := 0
    for i := 0; i < len(searchWord); i++ {
        if searchWord[i] != dictWord[i] {
            diffCnt += 1
            if diffCnt >= 2 {
                return false
            }
        }
    }
    if diffCnt == 0 {
        return false
    }
    return true
}