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 }