funcfindAndReplacePattern(words []string, pattern string) []string { var tmp map[rune]byte var ans []string for _, word := range(words) { word_ok := true for i, c := range(word) { //cannot use c (type rune) as type byte in map index // 需要定以为rune value, ok := tmp[c] if ok { if value != pattern[i] { word_ok = false break } } else { // panic: assignment to entry in nil map // 需要:= make(map[rune]byte) 或者 := map[rune]byte{} 进行地址分配 // 同为引用类型的slice,在使用append 向nil slice追加新元素就可以,原因是append方法在底层为slice重新分配了相关数组让nil slice指向了具体的内存地址 tmp[c] = pattern[i] } } if word_ok { ans = append(ans, word) } }
funcmatch(word, pattern string)bool { mp := map[rune]byte{} for i, x := range word { y := pattern[i] if mp[x] == 0 { mp[x] = y } elseif mp[x] != y { // word 中的同一字母必须映射到 pattern 中的同一字母上 returnfalse } } returntrue }
funcfindAndReplacePattern(words []string, pattern string)(ans []string) { for _, word := range words { if match(word, pattern) && match(pattern, word) { ans = append(ans, word) } } return }