題目
問題鏈接:https://leetcode.com/problems/keyboard-row/#/description
Given a List of words, return the words that can be typed using letters of alphabet on only one row’s of American keyboard like the image below.
Example 1:
Input: ["Hello", "Alaska", "Dad", "Peace"]Output: ["Alaska", "Dad"]
Note:
You may use one character in the keyboard more than once.
You may assume the input string will only contain letters of alphabet.
思路
- 用Map存儲字母到所在行的映射。
- 變量words,對每一個單詞,先做小寫字母轉換存入word,再對word的每個字母進行遍歷。用flag標記是否是第一個字母,用row存儲第一個字母所在的行,對后續的字母,判斷其所在行是否等于row,若不是,直接跳出內層循環繼續判斷下一個單詞。考慮到數組需要預先設置長度,而數組長度未知,所以判斷整個單詞完畢后將其縣存入List,最后再把List的元素存入結果數組。
代碼
keyboardRow.go
package _500_Keyboard_Row
import (
"fmt"
"strings"
)
var alphabetMap map[string]int
func init() {
alphabetMap = make(map[string]int)
row1 := []string{"q", "w", "e", "r", "t", "y", "u", "i", "o", "p"}
row2 := []string{"a", "s", "d", "f", "g", "h", "j", "k", "l"}
for _, v := range row1 {
alphabetMap[v] = 1
}
for _, v := range row2 {
alphabetMap[v] = 2
}
}
func findWord(word string) (ret bool) {
word = strings.ToLower(word)
var allRow int
allRow = alphabetMap[word[:1]]
length := len(word)
for i := 1; i < length; i++ {
row := alphabetMap[word[i:i+1]]
if allRow != row {
return false
}
}
return true
}
func FindWords(words []string) []string {
var ret []string
for _, v := range words {
ok := findWord(v)
if ok {
ret = append(ret, v)
}
}
fmt.Printf("ret:%+v\n", ret)
return ret
}
測試
keyboardRow_test.go
package _500_Keyboard_Row
import "testing"
func TestFindWords(t *testing.T) {
words := []string{
"Hello", "Alaska", "Dad", "Peace"}
ret := FindWords(words)
wanted := map[string]int{
"Alaska": 1,
"Dad": 2,
}
for _, v := range ret {
_, ok := wanted[v]
if !ok {
t.Errorf("fail, not want but have %+v\n", v)
return
}
}
t.Logf("pass")
}