携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情
题目描述
原题链接 :
500. 键盘行 - 力扣(LeetCode) (leetcode-cn.com)
给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
美式键盘 中:
- 第一行由字符 "qwertyuiop" 组成。
- 第二行由字符 "asdfghjkl" 组成。
- 第三行由字符 "zxcvbnm" 组成。
示例 1:
输入:words = ["Hello","Alaska","Dad","Peace"]
输出:["Alaska","Dad"]
示例 2:
输入:words = ["omk"]
输出:[]
示例 3:
输入:words = ["adsdf","sfd"]
输出:["adsdf","sfd"]
提示:
- 1 <= words.length <= 20
- 1 <= words[i].length <= 100
- words[i] 由英文字母(小写和大写字母)组成
思路分析
因为键盘上的字母是固定的,所以想的是把键盘字母所在的行存在 map 对象里,然后循环 words, 对每个输入的字符进行循环判断,字符在 map 里不存在,表示非字母,直接跳过, 不进行判断,存在判断是字符是不是在一行上,即 map 的 value 相等,增加一个标示符, true:表示输入的字符在同一行上,flase:反之
有什么不对的地方,欢迎讨论。
AC 代码
func findWords(words []string) []string {
if 0 == len(words) {
return nil
}
keyBoardMap := map[string]int{
"q": 1, "w": 1, "e": 1, "r": 1, "t": 1, "y": 1, "u": 1, "i": 1, "o": 1, "p": 1,
"a": 2, "s": 2, "d": 2, "f": 2, "g": 2, "h": 2, "j": 2, "k": 2, "l": 2,
"z": 3, "x": 3, "c": 3, "v": 3, "b": 3, "n": 3, "m": 3}
var strs []string
for _, word := range words {
var isRow = true
var prevRow int
for _, v := range word {
if row, ok := keyBoardMap[string(v)]; !ok {
continue
} else {
if 0 != prevRow && prevRow != row {
isRow = false
continue
}
prevRow = row
}
}
if isRow {
strs = append(strs, word)
}
}
return strs
}