這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
題目
問題連結: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_Rowimport ( "fmt" "strings")var alphabetMap map[string]intfunc 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_Rowimport "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")}